subtask 0全没过求条
查看原帖
subtask 0全没过求条
905636
_xguagua_Firefly_楼主2024/11/11 08:06

rt

#include <bits/stdc++.h>
#define int long long
using namespace std;

constexpr int MAXN = 1e4 + 24,MAXM = 1e5 + 24;
int n,m,u,v;
struct graph
{
    struct edge
    {
        int u,v,next;
    }e[MAXM << 1];
    int head[MAXN],cnt;
    void add(int u,int v)
    {
        e[++cnt].u = u;
        e[cnt].v = v;
        e[cnt].next = head[u];
        head[u] = cnt;
    }
}o,g;

int a[MAXN],val[MAXN];
int dfn[MAXN],low[MAXN],timer,scc[MAXN],num;
stack<int> st;
bool vis[MAXN];
void tarjan(int u)
{
    dfn[u] = low[u] = ++timer;
    st.push(u);
    vis[u] = 1;
    for(int i = o.head[u];i;i = o.e[i].next)
    {
        int v = o.e[i].v;
        if(!dfn[v])
        {
            tarjan(v);
            low[u] = min(low[u],low[v]);
        }
        else
            low[u] = min(low[u],dfn[v]);
    }
    if(low[u] == dfn[u])
    {
        int v = -1;
        ++num;
        while(v != u)
        {
            v = st.top();
            st.pop();
            scc[v] = num;
            val[num] += a[v];
            vis[v] = 0;
        }
    }
}

int in[MAXN],dp[MAXN];
queue<int> q;
int topo()
{
    for(int i = 1;i <= num;i++)
    {
        if(!in[i])
        {
            q.push(i);
            dp[i] = val[i]; 
        }
    }
    while(!q.empty())
    {
        int u = q.front();
        q.pop();
        for(int i = g.head[u];i;i = g.e[i].next)
        {
            int v = g.e[i].v;
            dp[v] = max(dp[v],dp[u] + val[v]);
            --in[v];
            if(!in[v])
                q.push(v);
        }
    }
    int ans = -1;
    for(int i = 1;i <= n;i++)
        ans = max(ans,dp[i]);
    return ans;
}
signed main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin >> n >> m;
    for(int i = 1;i <= n;i++)
        cin >> a[i];
    for(int i = 1;i <= n;i++)
    {
        cin >> u >> v;
        o.add(u,v);
    }
    for(int i = 1;i <= n;i++)
    {
        if(!dfn[i])
            tarjan(i);
    }
    for(int i = 1;i <= m;i++)
    {
        int u = o.e[i].u,v = o.e[i].v;
        if(scc[u] != scc[v])
        {
            g.add(scc[u],scc[v]);
            ++in[scc[v]];
        }
    }
    cout << topo();
}
2024/11/11 08:06
加载中...