社区讨论

求解 40分

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

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mi6ib9l7
此快照首次捕获于
2025/11/20 05:20
4 个月前
此快照最后确认于
2025/11/20 05:20
4 个月前
查看原帖
CPP
#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#define N 100005*2
#include <set>
using namespace std;
int n,m;
int dfn[N];
int tim=0;
int topp=0;
int low[N];
int bel[N];
int cnt;
bool v[N];
int stack[N];
int out[N];
int in[N];
int size[N];
vector <int> g[N];
vector <int> f[N];
set <int> to[N];
int val[N];
int qian[N];
int ans=0;
int xx[N];
int yy[N];
int dis[N];
bool vis[N];
void tarjan(int u){
    dfn[u]=low[u]=++tim;
    stack[++topp]=u;
    v[u]=true;
    for(int i=0;i<g[u].size();i++){
        int dmf=g[u][i];
        if(!dfn[dmf]){
            tarjan(dmf);
            low[u]=min(low[u],low[dmf]);
        }
        else if(v[dmf]) low[u]=min(low[u],dfn[dmf]);
    }
    if(low[u]==dfn[u]){
        cnt++;
        int vv;
        do{
            vv=stack[topp--];
            v[vv]=false;
            bel[vv]=cnt;
            qian[cnt]+=val[vv];
        }while(vv!=u);
    }
}
inline void rebuild(){
  for(int i=1;i<=m;i++){
      if(bel[xx[i]]!=bel[yy[i]])
       f[xx[i]].push_back(yy[i]);
  }
}
inline void spfa(int u){
    memset(dis,0,sizeof(dis));
    memset(vis,0,sizeof(vis));
    queue<int>q;
    q.push(u);
    vis[u]=true;
    dis[u]=qian[u];
    while(!q.empty()){
        int d2=q.front();
        q.pop();
        vis[d2]=0;
        int tt=f[d2].size();
        for(int i=0;i<tt;++i){
            if(dis[f[d2][i]]<qian[f[d2][i]]+dis[d2])
            {
                dis[f[d2][i]]=qian[f[d2][i]]+dis[d2];
                if(!vis[f[d2][i]]){
                    vis[f[d2][i]]=1;
                    q.push(f[d2][i]);
                }
            }
        }
    }
    for(int i=1;i<=cnt;i++) ans=max(ans,dis[i]);
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&val[i]);
    }
    for(int i=1;i<=m;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        xx[i]=u;
        yy[i]=v;
        g[u].push_back(v);
    }
    for(int i=1;i<=n;i++){
         if(!dfn[i]) tarjan(i);
    }
    rebuild();
    for(int i=1;i<=cnt;i++){
        spfa(i);
    }
    printf("%d",ans);
}

回复

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

正在加载回复...