tarjan + topo 40pts WA+RE求调
查看原帖
tarjan + topo 40pts WA+RE求调
635780
BeBanned楼主2023/6/9 13:10

tarjan + topo 40pts WA + RE求调

调吐了。。。

#include <iostream>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
int n,m;
int a[10005];
vector<int> adj[10005];
vector<int> adj2[10005];
stack<int> st;
int pre[10005];
int low[10005];
int sccNo[10005];
int dscc[10005];
int dis[10005];
int ind[10005];
int scccount = 0;
int dfsTime = 0;
// 缩点
void tarjan(int u)
{
    pre[u] = low[u] = ++ dfsTime;
    st.push(u);
    for(int i = 0;i < adj[u].size();i ++)
    {
        int v = adj[u][i];
        if(!pre[v])
        {
            tarjan(v);
            low[u] = min(low[u],low[v]);
        }
        else if(!sccNo[v])
        {
            low[u] = min(low[u],pre[v]);
        }
    }
    if(low[u] == pre[u])
    {
        sccNo[u] = ++ scccount;
        dscc[scccount] = a[u];
        while(true)
        {
            if(st.empty()) break;
            if(st.top() == u) break;
            int f = st.top();
            sccNo[f] = scccount;
            dscc[scccount] += a[f];
            st.pop();
        }
        st.pop();
    }
}
void toposort()
{
    queue<int> q;
    for(int i = 1;i <= n;i ++)
    {
        if(ind[i] == 0)
        {
            dis[i] = dscc[i];
            q.push(i);
        }
    }
    while(!q.empty())
    {
        int u = q.front();
        q.pop();
        for(int i = 0;i < adj2[u].size();i ++)
        {
            int v = adj[u][i];
            dis[v] = max(dis[v],dis[u] + dscc[v]);
            ind[v] --;
            if(!ind[v]) q.push(v);
        }
    }
}
int main()
{
    cin >> n >> m;
    for(int i = 1;i <= n;i ++) cin >> a[i];
    while(m --)
    {
        int u,v;
        cin >> u >> v;
        adj[u].push_back(v);
    }
    for(int i = 1;i <= n;i ++)
    {
        if(!pre[i])
        {
            dfsTime = 0;
            tarjan(i);
        }
    }
    for(int i = 1;i <= n;i ++)
    {
        for(int j = 0;j < adj[i].size();j ++)
        {
            int g = adj[i][j];
            if(sccNo[i] != sccNo[g])
            {
                adj2[sccNo[i]].push_back(sccNo[g]);
                ind[sccNo[g]] ++;
            }
        }
    }
    // 变为有向无环图
    toposort();
    int ans = -10000000;
    for(int i = 1;i <= n;i ++)
    {
        ans = max(ans,dis[i]);
    }
    cout << ans << endl;
    return 0;
}
2023/6/9 13:10
加载中...