WA#1、4、5、7
查看原帖
WA#1、4、5、7
559641
cgy2022楼主2024/8/11 21:40
#include<bits/stdc++.h>
#include<deque>
using namespace std;
const int N=1e4+10,M=1e5+10;
int fir[N],nex[M],en[M];
int dfn[N],low[N],p[N],s[N],cnt,top,c[N],du[N];
void add(int u,int v){
	nex[++cnt]=fir[u];
	fir[u]=cnt;
	en[cnt]=v;
}
bool b[N];
int a[N],f[N];
void dfs(int u){
	dfn[u]=low[u]=++top;
	s[top]=u;
	b[u]=true;
	int t=fir[u];
	while(t>0){
		int v=en[t];
		if(dfn[v]==0){
			dfs(v);
			low[u]=min(low[u],low[v]);
		}
		else if(b[v]) low[u]=min(low[u],low[v]);
		t=nex[t];
	}
	if(dfn[u]==low[u]){
		cnt++;
		while(top>=dfn[u]){
			int v=s[top--];
			b[v]=false;
			p[v]=cnt;
			c[cnt]+=a[v];
		}
	}
}
bool g[N][N];
int ans;
deque<int> d;
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=m;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v);
	} 
	cnt=0;
	for(int i=1;i<=n;i++)
		if(dfn[i]==0) dfs(i);
	for(int i=1;i<=n;i++){
		int t=fir[i];
		while(t>0){
			int v=en[t];
			if(p[i]!=p[v]){
				du[p[v]]++;
				g[p[i]][p[v]]=true;
			}
			t=nex[t];
		}
	}
	for(int i=1;i<=cnt;i++){
		if(du[i]==0){
			d.push_back(i);
			f[i]=c[i];
		}
	}
	while(!d.empty()){
		int u=d.front();
		d.pop_front();
		for(int i=1;i<=cnt;i++)
			if(g[u][i]){
				f[i]=max(c[i]+f[u],f[i]);
				du[i]--;
				if(du[i]==0) d.push_back(i);
			}
	}
	for(int i=1;i<=cnt;i++) ans=max(ans,f[i]);
	cout<<ans<<endl;
	return 0;
}
2024/8/11 21:40
加载中...