tarjan+topsort 40分求调
查看原帖
tarjan+topsort 40分求调
372172
Q__A__Q楼主2022/7/17 19:06

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;

const int maxn=1e5+10;
const int inf=1e9+7;
int n,m,ans,a[maxn],ind[maxn],dist[maxn];
stack<int> st;
vector<int> g[maxn],g2[maxn];
int u[maxn],v[maxn],dfn[maxn],low[maxn],color[maxn],vis[maxn],dfs_num,c;

inline int read() {
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') {
        if(ch=='-')w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
    return s*w;
}

inline void tarjan(int x) {
    dfn[x]=low[x]=++dfs_num;
    vis[x]=true;
    st.push(x);
    for(int i=0; i<g[x].size(); ++i) {
        int v=g[x][i];
        if(!dfn[v]) {
            tarjan(v);
            low[x]=min(low[x],low[v]);
        } else if(vis[v]) low[x]=min(low[x],dfn[v]);
    }
    if(dfn[x]==low[x]) {
        c++;
        while(1) {
            int s=st.top();
            st.pop();
            vis[s]=false;
            color[s]=c;
//			printf("%d ",s);
            if(x==s) break;
            a[c]+=a[s];
        }
//		puts("");
    }
}

inline int topsort() {
    queue<int> q;
    for(int i=1; i<=n; ++i)
        if(!ind[i]&&color[i]==i) q.push(i),dist[i]=a[i];
    while(!q.empty()) {
        int u=q.front();
        q.pop();
        for(int i=0; i<g2[u].size(); ++i) {
            int v=g2[u][i];
            dist[v]=max(dist[u]+a[v],dist[v]);
            if(--ind[v]==0) q.push(v);
        }
    }
    for(int i=1; i<=n; ++i)
        ans=max(ans,dist[i]);
    return ans;
}

signed main() {
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
    n=read(),m=read();
    for(int i=1; i<=n; ++i) a[i]=read();
    for(int i=1; i<=m; ++i) {
        u[i]=read(),v[i]=read();
        g[u[i]].push_back(v[i]);
    }
    for(int i=1; i<=n; ++i)
        if(!dfn[i]) tarjan(i);
    for(int i=1; i<=n; ++i) {
        int x=color[u[i]],y=color[v[i]];
        if(x!=y) {
            g2[x].push_back(y);
            ind[y]++;
        }
    }
    printf("%d\n",topsort());
    return 0;
}
2022/7/17 19:06
加载中...