求调,只过了#9
查看原帖
求调,只过了#9
1030602
yi_qing楼主2023/8/17 21:17
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;

const int N = 1e5 + 5;
int cnt;
int low[N], num[N], dfn;
int sccno[N], stack[N], top, d[N];
int a[N];
int in[N], ans2[N];
vector<int> G[N],g[N];//邻接表存图;

void dfs(int u) {
    stack[top++] = u;
    low[u] = num[u] = ++dfn;
    for (int i = 0; i < G[u].size(); i++) {
        int v = G[u][i];
        if (!num[v]) {
            dfs(v);
            low[u] = min(low[u], low[v]);
        }
        else if (!sccno[v]) {
            low[u] = min(low[v], low[u]);
        }
    }
    if (low[u] == num[u]) {
        cnt++;
        while (1) {
            int v = stack[--top];
            sccno[v] = cnt;
            d[cnt] += a[v];
            if (u == v) break;
        }
    }
}
void tarjan(int n) {
        cnt = top = dfn = 0;
        for (int i = 1; i <= n; i++) {
            if (!num[i]) {
                dfs(i);
            }
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 0; j < G[i].size(); j++) {
                if (low[i] != low[G[i][j]]) {
                    in[sccno[G[i][j]]]++;
                    g[sccno[i]].push_back(sccno[G[i][j]]);
                }
            }
        }
}
void topo() {
    queue<int> q;
    for (int i = 1; i <= cnt; i++) {
        if (in[i] == 0) {
            q.push(i);
            ans2[i] = d[i];
        }
    }
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        for (int i = 0; i < g[u].size(); i++) {
            int v = g[u][i];
            in[v]--;
            ans2[v] = max(ans2[v], ans2[u] + d[v]);//找最大值应该写在入度为0之前;
            if (!in[v]) {
                q.push(v);
            }
        }
    }
}
int ans;
int main() {
    int n, m, u, v;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
        G[i].clear();
    }
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
    }
    for (int i = 1; i <= m; i++) {
        scanf("%d%d", &u, &v);
        G[u].push_back(v);
    }
    tarjan(n);
    topo();
    for (int i = 1; i <= cnt; i++) {
        ans = max(ans2[i], ans);
    }
    printf("%d", ans);
    return 0;
}
2023/8/17 21:17
加载中...