WA on#4 #5 #7
查看原帖
WA on#4 #5 #7
743593
xiarui1楼主2025/8/4 20:28
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=10010;
vector<int>g[N];
stack<int>st;
vector<int>nd[N];
vector<int>ng[N];
vector<int>np[N];
set<int>t;
queue<int>q;
int low[N],dfn[N],tot,n,m,u,v,ind,k,c[N],s,w[N],nw[N],dp[N],id[N],ma;
bool vis[N],f[N];
void tarjan(int x){
	low[x]=dfn[x]=++ind;
	st.push(x);
	vis[x]=1;
	for(int i=0;i<g[x].size();i++){
		int tmp=g[x][i];
		if(!dfn[tmp]){
			tarjan(tmp);
			low[x]=min(low[x],low[tmp]);
		}else if(vis[tmp]){
			low[x]=min(low[x],dfn[tmp]);
		}
	}
	if(low[x]==dfn[x]){
		tot++;
		int u;
		do{
			u=st.top();
			st.pop();
			vis[u]=0;
			c[u]=tot;
			k++;
		}while(x!=u);
		if(k>1) s++;
	}
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>w[i];
	}
	for(int i=0;i<m;i++){
		cin>>u>>v;
		g[u].push_back(v);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]) tarjan(i);
	}
	
	for(int i=1;i<=n;i++){
		nd[c[i]].push_back(i);
	}
//	cout<<tot<<"\n";
//	for(int i=1;i<=n;i++){
//		cout<<c[i]<<" ";
//	}
	for(int i=1;i<=tot;i++){
		for(int j=0;j<nd[i].size();j++){
			nw[i]+=w[nd[i][j]];
		}
	}
	for(int i=1;i<=n;i++){
		t.clear();
		for(int j=0;j<g[i].size();j++){
			if(c[g[i][j]]!=c[i]){
				t.insert(c[g[i][j]]);
			}
		}
		for(auto j=t.begin();j!=t.end();j++){
			ng[*j].push_back(c[i]);
			np[c[i]].push_back(*j);
			id[*j]++;
		}
	}
//	for(int i=1;i<=tot;i++){
//		for(int j=0;j<ng[i].size();j++){
//			cout<<i<<" "<<ng[i][j]<<"\n";
//		}
//	}
	for(int i=1;i<=tot;i++){
		if(!id[i]){
			q.push(i);
			dp[i]=nw[i];
		}
	}
	while(!q.empty()){
		int i=q.front();
		q.pop();
		for(int j=0;j<np[i].size();j++){
			if(!(--id[np[i][j]])) q.push(np[i][j]);
		}
		for(int j=0;j<ng[i].size();j++){
			dp[i]=max(dp[j],dp[ng[i][j]]+nw[i]);
		}
	}
	for(int i=1;i<=tot;i++){
		ma=max(ma,dp[i]);
	}
	cout<<ma;
	return 0;
}

2025/8/4 20:28
加载中...