Homework Introduction

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int n,m,fa[N];
int find(int x){
	if(x==fa[x])return x;
	else return fa[x] = find(fa[x]);
}
void merge(int x,int y){
	int fx=find(x),fy=find(y);
	if(fx!=fy){
		if(fx<fy)fa[fy] = fx;
		else fa[fx] = fy;
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=3*n;i++){
		fa[i] = i;
	}
	int res = 0;
	for(int i=1;i<=m;i++){
		int pos,x,y;
		cin>>pos>>x>>y;
		if(x>n || y>n){
			res++;
			continue;
		}
		if(pos==2 && x==y){
			res++;
			continue;
		}
		if(pos==1){
			if(find(x)==find(y+n) || find(x+n)==find(y+2*n) || find(x+2*n)==find(y)){
				res++;
				continue;
			}
			if(find(y)==find(x+n) || find(y+n)==find(x+2*n) || find(y+2*n)==find(x)){
				res++;
				continue;
			}
			merge(x,y);merge(x+n,y+n);merge(x+n+n,y+n+n);
		}
		if(pos==2){
			//x吃y  x->y+n    x+n->y+2*n   x+2*n->y 
			if(find(x)==find(y) || find(x+n)==find(y+n) || find(x+2*n)==find(y+2*n)){
				res++;
				continue;
			}
			if(find(y)==find(x+n) || find(y+n)==find(x+2*n) || find(y+2*n)==find(x)){
				res++;
				continue;
			}
			merge(x,y+n);merge(x+n,y+n+n);merge(x+n+n,y);
		}
	}
	cout<<res<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
vector<int>e[N],g[N];
int n,m,book[N],dfn[N],low[N],tot,num,a[N],sum[N],id[N],u[N],v[N];
int f[N],in[N],out[N];
stack<int>stk;
void tarjan(int x){
	dfn[x] = low[x] = ++tot;
	stk.push(x);
	book[x] = 1;
	for(auto v:e[x]){
		if(!dfn[v]){
			tarjan(v);
			low[x] = min(low[x],low[v]);
		}
		else if(book[v])low[x] = min(low[x],dfn[v]);
	}
	if(low[x]==dfn[x]){
		int v;
		num++;
		do{
			v = stk.top();stk.pop();book[v]=0;
			id[v] = num;
			sum[num]+=a[v];
		}while(v!=x);
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		u[i] = x,v[i] = y;
		e[x].push_back(y);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i])tarjan(i);
	}
	for(int i=1;i<=m;i++){
		int x = id[u[i]],y=id[v[i]];
		if(x!=y){
			g[x].push_back(y);
			in[y]++;
		}
	}
	queue<int>q;
	int res = 0;
	for(int i=1;i<=num;i++){
		if(in[i]==0){
			f[i] = sum[i];
			q.push(i);
		}
		res = max(res,sum[i]);
	}
	
	while(!q.empty()){
		int tmp = q.front();
		q.pop();
		for(auto v:g[tmp]){
			in[v]--;
			if(in[v]==0)q.push(v);
			f[v] = max(f[v],f[tmp]+sum[v]);
			res = max(res,f[v]);
		}
	}
	cout<<res<<endl;
	return 0;
}
Status
Done
Problem
26
Open Since
2026-1-26 0:00
Deadline
2026-3-31 23:59
Extension
24 hour(s)