社区讨论

求条必关

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mm4w47g5
此快照首次捕获于
2026/02/27 20:50
上周
此快照最后确认于
2026/03/01 17:35
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;
//		ans[scc_cnt].push_back(u);
		while(s.top()!=u){
			scc[s.top()]=scc_cnt;
//			ans[scc_cnt].push_back(s.top());
			ins[s.top()]=0;
			s.pop();
		}
		ins[u]=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];
		}
	}
	while(!q.empty()){
		int i=q.front();
		q.pop();
		for(int j=gg.hd[i];j;j=gg.nxt[j]){
			int u=scc[i],v=scc[gg.to[j]];
			dp[v]=max(dp[v],dp[u]+na[v]); 
			in[v]--;
			if(in[v]==0){
				q.push(v);
			}
		}
	}
//	cout<<scc_cnt<<endl;
//	for(int i=1;i<=cnt;i++){
//		sort(ans[i].begin(),ans[i].end());
//	}
//	for(int i=1;i<=scc_cnt;i++){
//		for(int v:ans[i]){
//			cout<<v<<" ";
//		}
//		cout<<endl; 
//	}
//	for(int i=1;i<=n;i++)cout<<na[i]<<" ";
//	cout<<endl;
//	for(int i=1;i<=n;i++)cout<<dp[i]<<" ";
//	cout<<endl;
	int res=INT_MIN;
	for(int i=1;i<=n;i++)res=max(res,dp[i]);
	cout<<res;
	return 0;
}

回复

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

正在加载回复...