求助 WA on#1,3,4,5,7,9
查看原帖
求助 WA on#1,3,4,5,7,9
333855
int233楼主2022/3/19 09:40

RT

Code:

#include<iostream>
#include<stack>
#include<vector>
#include<queue>
using namespace std;
int dfn[10005],low[10005],vis[10005],tot,gx,in[10005],x[100005],y[100005],dis[10005],scp[10005],c[10005],id[10005],gs[10005];
stack<int> s;
vector<int> G[10005],T[10005];
queue<int> q;
void tarjan(int x){
	s.push(x);
	dfn[x]=low[x]=++tot;vis[x]=1;
	for(int i=0;i<G[x].size();i++){
		if(!dfn[G[x][i]]){
			tarjan(G[x][i]);
			low[x]=min(low[x],low[G[x][i]]);
		}
		else if(vis[G[x][i]]){
			low[x]=min(low[x],low[G[x][i]]);
		}
	}
	int k;
    if(low[x]==dfn[x]){
    	while(!s.empty()){
    		k=s.top();
            s.pop();
            vis[k]=0;
            scp[k]=x;
            if(k==x){
            	break;
			}
            dis[x]+=dis[k];
        }
    }
}
int main(){
	int n,m,ans=0,ix=1;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>dis[i];
	}
	while(m--){
		cin>>x[ix]>>y[ix];
		G[x[ix]].push_back(y[ix]);
		ix++;
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]){
			tarjan(i);
		}
	}
	for(int i=1;i<=m;i++){
		if(scp[x[i]]==scp[y[i]]){
			continue;
		}
		T[scp[x[i]]].push_back(scp[y[i]]);
		in[scp[y[i]]]++;
	}
	for(int i=1;i<=n;i++){
		if(scp[i]==i&&!in[i]){
			c[i]=dis[i];
			q.push(i); 
		}
	}
	while(!q.empty()){
		int cur=q.front();
		q.pop();
		for(int i=0;i<T[cur].size();i++){
			in[T[cur][i]]--;
			c[T[cur][i]]=max(c[cur]+dis[T[cur][i]],c[T[cur][i]]);
			if(!in[T[cur][i]]){
				q.push(T[cur][i]);
			}
		}
	}
	for(int i=1;i<=n;i++){
		cout<<c[i]<<endl;
		ans=max(ans,c[i]);
	}
	cout<<ans;
	return 0;
} 
2022/3/19 09:40
加载中...