萌新求助,数组1e6 40分,1e4 WA+RE 0分
查看原帖
萌新求助,数组1e6 40分,1e4 WA+RE 0分
362627
frank15楼主2021/2/27 11:33
#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
const int maxn=1e4+5;
int n,m,tot,ans;
int a[maxn],X[maxn],Y[maxn],mark[maxn],sum[maxn],dp[maxn];
bool vis[maxn];
stack<int> st;
vector<int> v[maxn],v2[maxn],v3[maxn];
void dfs(int k){
	vis[k]=1;
	for(int i=0;i<v[k].size();i++)
		if(!vis[v[k][i]])
			dfs(v[k][i]);
	st.push(k);
}
void dfs2(int k){
	mark[k]=tot;
	sum[tot]+=a[k];
	for(int i=0;i<v2[k].size();i++)
		if(!mark[v2[k][i]])
			dfs2(v2[k][i]);
	return ;
}
void Kosaraju(){
	for(int i=1;i<=n;i++)
		if(!vis[i])
			dfs(i);
	while(st.size()){
		int x=st.top();
		st.pop();
		if(!mark[x]){
			tot++;
			dfs2(x);
		}
	}
	return ;
}
void dfs3(int k){
	dp[k]=sum[k];
	for(int i=0;i<v[k].size();i++)
		if(!mark[v[k][i]]){
			dfs3(v[k][i]);
			dp[k]+=dp[v[k][i]];
		}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&X[i],&Y[i]);
		v[X[i]].push_back(Y[i]);
		v2[Y[i]].push_back(X[i]);
	}
	Kosaraju();
	for(int i=1;i<=m;i++)
		if(mark[X[i]]!=mark[Y[i]])
			v3[X[i]].push_back(Y[i]);
	for(int i=1;i<=tot;i++)
		if(!dp[i]){
			dfs3(i);
			ans=max(ans,dp[i]);
		}
	cout<<ans<<endl;
	return 0;
}
2021/2/27 11:33
加载中...