社区讨论
灵异事件求助
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 条回复,欢迎继续交流。
正在加载回复...