40 pts求调
查看原帖
40 pts求调
982938
SnowFlavour楼主2024/7/29 20:55
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e4+10;
int y[N][N],low[N],dfn[N],tot=0,sc=0,scc[N],s[N],head=0,sz[N],n,m,f[N],a[N],p[N];
bool ins[N];
vector<int>e[N];
vector<int>G[N];
void tarjan(int x){
    low[x]=dfn[x]=++tot;
    s[head++]=x;
    ins[x]=1;
    for(int i=0;i<e[x].size();i++){
        int v=e[x][i];
        if(!dfn[v])tarjan(v),low[x]=min(low[x],low[v]);
        else if(ins[v])low[x]=min(low[x],dfn[v]);
    }
    if(dfn[x]<=low[x]){
        sc++;
        while(s[head]!=x){
            sz[sc]+=a[s[head]];
            scc[s[head]]=sc;
            ins[s[head]]=0;
            head--;
        }
        scc[x]=sc;
        ins[x]=0;
        sz[sc]+=a[x];
        head--;
    }
}
void top(){
    queue<int>q;
    for(int i=1;i<=sc;i++){
        if(p[i]==0)q.push(i),f[i]=sz[i];
    }
    while(!q.empty()){
        int u=q.front();q.pop();
        for(int i=0;i<G[u].size();i++){
            int v=G[u][i];
            f[v]=max(f[v],f[u]+sz[v]);
            cout<<f[v]<<endl;
            p[v]--;
            if(p[v]==0)q.push(v);
        }
    }
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=m;i++){
        int u,v;
        cin>>u>>v;
        if(u!=v)e[u].push_back(v);
    }
    for(int i=1;i<=n;i++){
        if(!dfn[i])tarjan(i);
    }
    for(int i=1;i<=n;i++){
        for(int j=0;j<e[i].size();j++){
            int v=e[i][j];
            if(scc[v]!=scc[i])G[scc[i]].push_back(scc[v]),p[scc[v]]++;
        }
    }
    int ans=0;
    top();
    for(int i=1;i<=n;i++)ans=max(ans,f[i]);
    cout<<ans<<endl;
}
2024/7/29 20:55
加载中...