缩点模板求调
  • 板块题目总版
  • 楼主Lysea
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/10/3 15:07
  • 上次更新2023/10/27 09:02:58
查看原帖
缩点模板求调
616733
Lysea楼主2022/10/3 15:07

题目传送门

#include<bits/stdc++.h>
#define N 100005
using namespace std;
struct star{
    int to,next;
}e[N],e1[N];
bool vis[N];
int dfn[N],low[N],sck[N],fnt,num,head[N],head1[N],cnt,cnt1,n,m,dot[N],bel[N],dp[N],in[N],ans;
void add(int u,int v){
    e[++cnt].next=head[u];
    head[u]=cnt;
    e[cnt].to=v;
}
void add1(int u,int v){
    e1[++cnt1].next=head1[u];
    head1[u]=cnt1;
    e1[cnt1].to=v;
}
void tp_sort(){
    queue<int>q;
    for(int i=1;i<=n;i++){
        if(!in[i]&&bel[i]==i) q.push(i),dp[i]=dot[i];
    }
    while(!q.empty()){
        int t=q.front();
        q.pop();
        for(int i=head1[t];i;i=e1[i].next){
            int y=e1[i].to;
            dp[y]=max(dp[y],dp[t]+dot[y]);
            in[y]--;
            if(!in[y]) q.push(y);
        }
    }
}
void Tarjan(int x){
    dfn[x]=low[x]=++num;
    sck[++fnt]=x;
    vis[x]=true;
    for(int i=head[x];i;i=e[i].next){
        int y=e[i].to;
        if(!dfn[y]){
            Tarjan(y);
            low[x]=min(low[x],low[y]);
        }else if(vis[y]) low[x]=min(low[x],low[y]);
    }
    if(dfn[x]==low[x]){
        while(int y=sck[fnt--]){
            bel[y]=x;
            vis[y]=false;
            if(x==y) break;
            dot[x]+=dot[y];
        }
    }
}
void rebuild(){
    for(int i=1;i<=n;i++){
        for(int j=head[i];j;j=e[j].next){
            int y=e[j].to;
            if(bel[i]!=bel[y]){
                in[bel[y]]++;
                add1(bel[i],bel[y]);
            }
        }
    }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>dot[i];
    for(int i=1,u,v;i<=n;i++){
        cin>>u>>v;
        add(u,v);
    }
    for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i);
    rebuild();
    tp_sort();
    for(int i=1;i<=n;i++){
        ans=max(ans,dp[i]);
    }cout<<ans<<endl;
    return 0;
}

全WA掉,有没有dalao帮一下

2022/10/3 15:07
加载中...