蒟蒻求助!!! 70pts
查看原帖
蒟蒻求助!!! 70pts
129425
马邦德楼主2022/3/11 21:51
#pragma warning(disable:4996)
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<string>
#include<unordered_map>
#include<stack>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef  long long LL;
const LL N = 1e4+5;
const LL M = 2e5+5;
const LL INF = 0x7ffffff;
const LL P = 1000000007;
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;
}
struct edge {
    int v, nxt;
}e[M],E[M];
int pre[N],pt[N],prE[N];
int cnt,idx;
stack<int>s;
bool vis[N];
void ade(int u, int v) {
    ++cnt;
    e[cnt].v = v;
    e[cnt].nxt = pre[u];
    pre[u] = cnt;
}
void adE(int u, int v) {
    ++cnt;
    E[cnt].v = v;
    E[cnt].nxt = prE[u];
    prE[u] = cnt;
}
struct node {
    int dfn, low,col,v;
}a[N];
void dfs(int x) {
    a[x].dfn = a[x].low = ++cnt;
    s.push(x);
    for (int i = pre[x]; i; i = e[i].nxt) {
        int v = e[i].v;
        if (!a[v].dfn) {
            dfs(v);
            a[x].low = min(a[x].low, a[v].low);
        }
        else if (!a[v].col) a[x].low = min(a[v].low, a[x].low);
    }
    if (a[x].dfn == a[x].low) {
        int k = -1;
        ++idx;
        do {
            k = s.top();
            s.pop();
            a[k].col = idx;
            pt[idx]+=a[k].v;
        } while (k != x);
    }
}
struct nod {
    int u, d;
    friend bool operator <(nod A, nod B) {
        return  B.d > A.d;
    }
};
priority_queue<nod>q;
int dis[N];
int ans;
void dj(int cur) {
    for (int i = 1; i <= idx; i++) dis[i] = 0, vis[i] = false;;
    dis[cur] = pt[cur];
    ans = max(ans, dis[cur]);
    q.push(nod{ cur,dis[cur] });
    while (!q.empty()) {
        nod T = q.top(); q.pop();
        int u = T.u, d = T.d;
        if (vis[u]) continue;
        vis[u] = true;
        for (int i = prE[u]; i; i = E[i].nxt) {
            int v = E[i].v;
            if (dis[v] < d + pt[v]) {
                dis[v] = d + pt[v];
                ans = max(ans, dis[v]);
                if (!vis[v]) q.push(nod{ v,dis[v] });
            }
        }
    }
}
int main() {
    int n = read(), m = read();
    for (int i = 1; i <= n; i++) a[i].v = read();

    for (int i = 1; i <= m; i++) {
        int u = read(), v = read();
        ade(u, v);
    }
    cnt = 0;
    for (int i = 1; i <= n; i++) {
        if (a[i].dfn) continue;
        dfs(i);
    }
    cnt = 0;
    for(int i=1;i<=n;i++)
        for (int j = pre[i]; j; j = e[j].nxt) {
            int v = e[j].v;
            if (a[i].col != a[v].col) adE(a[i].col, a[v].col);
        }
    for (int i = 1; i <= idx; i++) {
        dj(i);
    }
    printf("%d", ans);
    return 0;
}
2022/3/11 21:51
加载中...