社区讨论

灵异事件求助

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

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mhjbaveg
此快照首次捕获于
2025/11/03 23:45
4 个月前
此快照最后确认于
2025/11/03 23:45
4 个月前
查看原帖
CPP
#include<iostream>
#include<vector>
#include<queue>
#define int long long
using namespace std;
int low[100005] , dfn[10005] , s[10005] , num[10005] , dfncnt;
int sc , sz[10005] , n , m , d[10005] , dp[10005] , tp , color[100005];
vector<int> g[10005] , vec[10005];
struct node{
	int u , v;
};
vector<node> edge;
bool in_stack[10005];
void tarjan(int u){
	low[u] = dfn[u] = ++dfncnt , s[++tp] = u , in_stack[u] = 1;
	for(int i=0;i<g[u].size();i++){
	    int v = g[u][i];
	    if(!dfn[v]){
	    	tarjan(v);
	    	low[u] = min(low[u],low[v]);
	    }else if(in_stack[v]){
	    	low[u] = min(low[u],dfn[v]);
	    }
	}
	if(dfn[u]==low[u]){
		++sc;
		do{
			color[s[tp]] = sc;
			sz[sc]++;
			in_stack[s[tp]] = 0;
		}while(s[tp--]!=u);
	}
}
void topsort(){
	queue<int> q;
	for(int i=1;i<=n;i++){
		if(d[i]==0)q.push(i);
	}
	while(!q.empty()){
		int u = q.front();q.pop();
		for(int i=0;i<vec[u].size();i++){
			int v = vec[u][i];
			d[v]-- , dp[v] = max(dp[v],dp[u]+num[v]);
			if(d[v]==0)q.push(v);
		}
	}
}
signed main(){
	cin >> n >> m;
	for(int i=1;i<=n;i++)cin >> dp[i];
	for(int i=1;i<=m;i++){
		int u , v;cin >> u >> v;
		g[u].push_back(v) , edge.push_back({u,v});
	}
	for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
	for(int i=1;i<=n;i++)num[color[i]] += dp[i];
	for(int i=1;i<=m;i++){
		int u = edge[i].u , v = edge[i].v;
		if(color[u]!=color[v]){
			vec[color[u]].push_back(color[v]) , d[color[v]]++;
		}
	}
	for(int i=1;i<=sc;i++)dp[i] = num[i];
	n = sc;
	topsort();
	int ans = 0;
	for(int i=1;i<=n;i++)ans = max(ans,dp[i]);
	cout << ans;
	return 0;
}
为什么这份代码在本地运行不了,在洛谷上却可以A?

回复

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

正在加载回复...