tarjan50分WA求大佬帮调
查看原帖
tarjan50分WA求大佬帮调
949182
taoruichen楼主2024/3/9 11:54

写得又臭又长,不好意思

#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 1e4;
const int M = 1e5 + 1e4;
int head[N],pre[N],id[N],dfn[N];
int low[N],w[N],s[N],rd[N],k,tp,tot;
int f[N],ans;
struct node{
    int u,to,next;
}e[M];
struct node2{
    int u,v,next;
}edges[M];
int n,m,sc,dfncnt;
bool insta[N];
queue <int> q;

void add(int u,int v){
    k++;
    e[k].u = u;
    e[k].next = head[u];
    e[k].to = v;
    head[u] = k;
}

void addd(int u,int v){
    tot++;
    edges[tot].u = u;
    edges[tot].v = v;
    edges[tot].next = pre[u];
    pre[u] = tot;
}

void tarjan(int u){
    insta[u] = 1;
    s[++tp] = u;
    low[u] = dfn[u] = ++dfncnt;
    for(int i = head[u];i;i = e[i].next){
        int v = e[i].to;
        if(!dfn[v]){
            tarjan(v);
            low[u] = min(low[u],low[v]);
        }else if(insta[v]) low[u] = min(low[u],dfn[v]);
    }
    if(dfn[u] == low[u]){
        sc++;
        while(s[tp] != u){
            id[s[tp]] = sc;
            insta[s[tp]] = 0;
            w[u] += w[s[tp]];
            --tp;
        }
        id[s[tp]] = sc;
        insta[s[tp]] = 0;
        --tp;
    }
}

void dp(){
    queue <int> q;
    for(int i = 1;i <= n;i++){
        if(!rd[i]){
            q.push(i);
            f[i] = w[i];
        }
    }
    while(!q.empty()){
        int u = q.front();
        for(int i = pre[u];i;i = edges[i].next){
            int v = edges[i].v;
            rd[v]--;
            if(!rd[v]) q.push(v);
            f[v] = max(f[u] + w[v],f[v]);
        }
        q.pop();
    }
    for(int i = 1;i <= n;i++) ans = max(ans,f[i]);
    printf("%d",ans);
}

int main(){
    scanf("%d%d",&n,&m);
    int u,v;
    for(int i = 1;i <= n;i++) scanf("%d",&w[i]);
    for(int i = 1;i <= m;i++){
        scanf("%d%d",&u,&v);
        add(u,v);
    }
    for(int i = 1;i <= n;i++)
        if(!dfn[i]) tarjan(i); 	//tarjan
    for(int i = 1;i <= m;i++){
        int x = e[i].u;
        int y = e[i].to;
        if(id[x] != id[y]){
            addd(x,y);
            rd[y]++;
        }
    }

    dp();
    return 0;
}

2024/3/9 11:54
加载中...