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