50分,WA on 34579,求助!!
查看原帖
50分,WA on 34579,求助!!
656765
STARSczy楼主2023/11/1 16:24
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+10,mod=1e9+7;
inline int read(){
	int c,w=0,n=0;
	while((c=getchar())<'0'||'9'<c) w=c=='-';
	do n=n*10+c-'0';while('0'<=(c=getchar())&&c<='9');
	return w?-n:n;
}
inline int write(int n){
	if(n<0) putchar('-'),n=-n;
	if(n>9) write(n/10);
	putchar(n%10+'0');
	return n;
}

int n=read(),m=read(),ans,tot,root[maxn],top,sum[maxn],a[maxn],p[maxn];
set<int> edge[maxn];

int dfsn[maxn],low[maxn],flag[maxn];
void tarjan(int x){
	dfsn[x]=++tot,p[x]=x;
	for(int i:edge[x]) if(!flag[i]){
		if(!dfsn[i]) tarjan(i);
		if(dfsn[i]<dfsn[x]) dfsn[x]=dfsn[i],p[x]=p[i];
	}
	flag[x]=1;
}
void dfs(int x){
	if(p[x]==-1) return;
	int mx=0;
	for(int i:edge[x]) if(p[i]){
		dfs(i);
		mx=max(mx,a[i]);
	}
	a[x]+=mx,p[x]=-1;
}

signed main(){
	for(int i=1;i<=n;++i) a[i]=read();
	for(int i=1;i<=m;++i){
		int u=read(),v=read();
		edge[u].insert(v);
	}
	for(int i=1;i<=n;++i) if(!flag[i]) tarjan(i);
	for(int i=1;i<=n;++i) if(p[i]!=i){
		for(int j:edge[i]) if(j!=p[i]) edge[p[i]].insert(j);
		a[p[i]]+=a[i],a[i]=0,edge[i].clear();
	}
	for(int i=1;i<=n;++i){
		dfs(i);
		ans=max(ans,a[i]);
	}
	write(ans);
	return 0;
}
2023/11/1 16:24
加载中...