社区讨论

40分求条必关

P3387【模板】缩点参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mm5jblwi
此快照首次捕获于
2026/02/28 07:40
上周
此快照最后确认于
2026/03/01 20:25
7 天前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10,M=1e5+10;
int n,m;
int ind,low[N],dfn[N];
int scc_cnt,scc[N],ins[N];
int cnt=0,in[N],dp[N],a[N],na[N];
stack<int>s;
vector<int>ans[N];
struct graph{
	int tot,hd[N];
	int nxt[M],to[M];
	void add(int x,int y){
		tot++;
		nxt[tot]=hd[x];
		hd[x]=tot;
		to[tot]=y;
	}
}g,gg;
void Tarjan(int u){
	dfn[u]=low[u]=++ind;
	s.push(u);
	ins[u]=1;
	for(int i=g.hd[u];i;i=g.nxt[i]){
		if(!dfn[g.to[i]]){
			Tarjan(g.to[i]);
			low[u]=min(low[u],low[g.to[i]]);
		}
		else if(ins[g.to[i]])low[u]=min(low[u],dfn[g.to[i]]);
	}	
	if(dfn[u]==low[u]){
		scc[u]=++scc_cnt;
		while(s.top()!=u){
			scc[s.top()]=scc_cnt;
			ins[s.top()]=0;
			s.pop();
		}
	}
	return ;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=m;i++){
		int a,b;
		cin>>a>>b;
		g.add(a,b);
	}
	for(int i=1;i<=n;i++)if(!dfn[i])Tarjan(i);
	for(int i=1;i<=n;i++){
		na[scc[i]]+=a[i];
		for(int j=g.hd[i];j;j=g.nxt[j]){
			int u=scc[i],v=scc[g.to[j]];
			if(v!=u){
				gg.add(u,v);
				in[v]++;
			}
		}
	}
	queue<int>q;
	for(int i=1;i<=n;i++){
		if(in[i]==0){
			q.push(i);
			dp[i]=na[i];
		}
	}
	int res=INT_MIN;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		res=max(res,dp[u]);
		for(int v=gg.hd[u];v;v=gg.nxt[v]){
			dp[v]=max(dp[v],dp[u]+na[v]); 
			in[v]--;
			if(in[v]==0){
				q.push(v);
			}
		}
	}
	cout<<res;
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...