社区讨论

求助,60分

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

讨论操作

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

当前回复
5 条
当前快照
1 份
快照标识符
@mi6i2x1h
此快照首次捕获于
2025/11/20 05:14
4 个月前
此快照最后确认于
2025/11/20 05:14
4 个月前
查看原帖
可以帮忙看下有什么问题吗,谢谢
CPP
#include<bits/stdc++.h>
#define N 10010
using namespace std;
struct Edge{
    int next,num;
}e[20*N];
vector<int> Point[N],E[N];
int l,Time,cnt,tot,dfn[N],low[N],in[N],st[N],num[N],v[N],vis[N];
long long f[N],V[N];
void add(int x,int y){
    e[++cnt]=(Edge){e[x].next,y};
    e[x].next=cnt;
}
void tarjan(int x){
    dfn[x]=low[x]=++Time;
    in[x]=1;st[++l]=x;
    for(int p=e[x].next;p;p=e[p].next){
        int k=e[p].num;
        if(!dfn[k]){
            tarjan(k);
            low[x]=min(low[x],low[k]);
        }else if(in[k]) low[x]=min(low[x],dfn[k]);
    }
    if(low[x]==dfn[x]){
        tot++;
        while(1){
            num[st[l]]=tot;
            Point[tot].push_back(st[l]);
            in[st[l]]=1;V[tot]+=v[st[l--]];
            if(st[l+1]==x) break;
        }
    }
}
void dfs(int x){
    vis[x]=1;
    for(int i=0;i<E[x].size();i++){
        int k=E[x][i];
        if(!vis[k]){
            dfs(k);
            f[x]=max(f[x],f[k]);
        }
    }
    f[x]+=V[x];
}
int main(){
    int n,m;
    scanf("%d%d",&n,&m);cnt=n;
    for(int i=1;i<=n;i++) scanf("%d",&v[i]);
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        add(x,y);add(y,x);
    }
    for(int i=1;i<=n;i++)
        if(!dfn[i]){
            Time=0;l=0;
            tarjan(i);
        }
    for(int i=1;i<=n;i++)
        for(int p=e[i].next;p;p=e[p].next){
            int k=e[p].num;
            if(num[i]!=num[k]) E[num[i]].push_back(num[k]);
        }
    long long ans=0;
    for(int i=1;i<=tot;i++)
        if(!vis[i]){
            dfs(i);
            ans=max(ans,f[i]);
        }
    printf("%lld\n",ans);
    return 0;
}

回复

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

正在加载回复...