求助,help
查看原帖
求助,help
809708
whssy楼主2023/9/24 16:24
#include<cstdio>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
const int N=1e4+5,M=1e5+5;
struct graph{
	int dfn,low,scc,val;
	bool vis;
	vector<int>edge;
};
graph e[N];
stack<int>sk;
int n,m,tot,id;
long long sum[N],ans;
pair<int,int> edge[M];
void tarjan(int u){
	e[u].dfn=e[u].low=++tot;
	sk.push(u);e[u].vis=1;
	for(int v:e[u].edge){
		if(!e[v].dfn){
			tarjan(v);
			e[u].low=min(e[u].low,e[v].low);
		}else if(e[v].vis)
			e[u].low=min(e[u].low,e[v].dfn);
	}
	if(e[u].dfn==e[u].low){
		int v;++id;
		do{
			v=sk.top();
			sk.pop();
			e[v].vis=0;
			e[v].scc=id;
			sum[id]+=e[v].val;
		}while(v!=u);
	}
}
struct scc{
	vector<int>edge;
	int in;
};
scc o[N];
long long dp[N];
int xy[N];
void top_sort(){
	queue<int>q;
	for(int i=1;i<=id;i++)
		if(!o[i].in) q.push(i);
	while(!q.empty()){
		int u=q.front();
		xy[++*xy]=u;
		q.pop();
		for(int v:o[u].edge){
			--o[v].in;
			if(o[v].in)
				q.push(v);
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&e[i].val);
	for(int i=1;i<=m;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		edge[i].first=u;edge[i].second=v;
		e[u].edge.push_back(v);
	}
	for(int i=1;i<=n;i++)
		if(!e[i].dfn) tarjan(i);
	for(int i=1;i<=m;i++){
		int u=edge[i].first,v=edge[i].second;
		if(e[u].scc!=e[v].scc){
			o[e[v].scc].edge.push_back(e[u].scc);
			o[e[u].scc].edge.push_back(e[v].scc);
			++o[e[v].scc].in;
		}
	}
	top_sort();
	for(int i=1;i<=id;i++){
		int u=xy[i];
		dp[u]=sum[u];
		for(int v:o[u].edge)
			dp[u]=max(dp[u],dp[v]+sum[u]);
	}
	for(int i=1;i<=id;i++)
		ans=max(ans,dp[i]);
	printf("%lld",ans);
	return 0;
}
2023/9/24 16:24
加载中...