90pts求调
查看原帖
90pts求调
292748
wrkwrkwrk楼主2023/9/26 15:29
#include<bits/stdc++.h>
using namespace std;
namespace _wrk{;
#define int long long
vector<int>g[11234]; 
vector<int>g2[11234]; 
vector<int>g22[11234]; 
int a[11234];
bool insta[11234];
int dfsid[11234],laid=1;;
int vl[11234]; 
bool vis[11234];
int d[11234];
struct bc{
	int aa[11234];
	void init(int n){
		for(int i=1;i<=n;i++)aa[i]=i;
	}
	int fin(int a){
		return aa[a]==a?a:(aa[a]=fin(aa[a]));
	}
	void me(int a,int b){
		if(a!=b)aa[fin(a)]=fin(b);
	}
}bcj;
int w[11234];
void dfs(int now){
	dfsid[now]=laid++;
	vis[now]=insta[now]=1;
	vl[now]=now;
	for(auto x:g[now]){
		if(!vis[x])dfs(x);
	}
	for(auto x:g[now]){
		if(insta[vl[x]]&&dfsid[vl[x]]<dfsid[vl[now]]){
			vl[now]=vl[x];
		}
	}
	insta[now]=0;
}
int main(){
	int n,m;
	cin>>n>>m;
	bcj.init(n);
	for(int i=1;i<=n;i++)cin>>a[i];
	while(m--){
		int a,b;
		cin>>a>>b;
		g[a].push_back(b); 
	}
	for(int i=1;i<=n;i++){
		if(!vis[i])dfs(i);
	}
	for(int i=1;i<=n;i++){
		if(bcj.fin(vl[i])!=bcj.fin(i)){
				
			a[bcj.fin(vl[i])]+=a[bcj.fin(i)];
			a[bcj.fin(i)]=0;
			bcj.me(i,vl[i]);
		}
		
	}
	for(int i=1;i<=n;i++){
		for(auto x:g[i]){
			if(bcj.fin(x)!=bcj.fin(i)){
				g2[bcj.fin(i)].push_back(bcj.fin(x)); 
				g22[bcj.fin(x)].push_back(bcj.fin(i)); 
				w[bcj.fin(x)]++;
			} 
		}
	}
	int ans=0;
	queue<int>l;
	for(int i=1;i<=n;i++){
		if(bcj.fin(i)==i&&w[i]==0){
			l.push(i);
			d[i]=a[i];
		}
	}
	while(l.size()){
		auto x=l.front();l.pop();
		for(auto xx:g22[x]){
			d[x]=max(d[x],d[xx]+a[x]);
		}
		for(auto xx:g2[x]){
			w[xx]--;
			if(w[xx]==0)l.push(xx);
		}
	}
	for(int i=1;i<=n;i++){
		ans=max(ans,d[i]);
	}
	cout<<ans;
	return 0;
}
}
signed main(){
	   return _wrk::main();
}

WA on Test #7。

2023/9/26 15:29
加载中...