90pts求调
查看原帖
90pts求调
781210
InvernoFrio楼主2023/10/26 14:56

自己测了一下好像是tarjan有点问题 参考的标程参考最下面的链接

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5 + 5;
int n , m , a , b , w;
int cmp[maxn] , dfn[maxn] , low[maxn] , in_stack[maxn];
int cnt[maxn] , dp[maxn] , in[maxn];
int timer , id;
stack<int>s;
struct edge {
    int b , w;
    edge(int B , int W) { b = B , w = W; }
};
vector<edge>G[maxn] , son[maxn];
void tarjan(int a) {
    low[a] = dfn[a] = ++timer;
    in_stack[a] = 1;
    s.push(a);

    int len = G[a].size();
    for (int i = 0;i < len;i++) {
        b = G[a][i].b;
        if (!dfn[b]) {
            tarjan(b);
            low[a] = min(low[a] , low[b]);
        }
        else if (in_stack[b]) {
            low[a] = min(low[a] , dfn[b]);
        }
    }
    if (dfn[a] == low[a]) {
        id++;
        while (in_stack[a]) {
            in_stack[s.top()] = 0;
            cmp[s.top()] = id;
            cnt[id]++;
            s.pop();
        }
    }
}
signed main() {
    freopen("AAA" , "r" , stdin);
    // freopen("A.out" , "w" , stdout);
    cin >> n >> m;
    for (int i = 1 , op;i <= m;i++) {
        cin >> op;
        cin >> a >> b;
        switch (op) {
        case 1:
            //a==b
            G[a].push_back(edge(b , 0));
            G[b].push_back(edge(a , 0));
            break;
        case 2:
            //a-b<0 -> a-b<=-1 -> b>=a+1
            G[a].push_back(edge(b , 1));
            break;
        case 3:
            //a-b>=0 -> a>=b
            G[b].push_back(edge(a , 0));
            break;
        case 4:
            //a-b>0 -> a-b>=1 -> a>=b+1
            G[b].push_back(edge(a , 1));
            break;
        case 5:
            //a-b<=0 -> b>=a
            G[a].push_back(edge(b , 0));
            break;
        }
    }
    for (int i = 1;i <= n;i++) {
        if (!dfn[i]) tarjan(i);
    }
    // cout << id << endl;
    // for (int i = 1;i <= n;i++)cout << cmp[i] << endl;
    for (a = 1;a <= n;a++) {
        for (edge e : G[a]) {
            b = e.b , w = e.w;
            if (cmp[a] == cmp[b] && w == 1) {
                // cout << -1 << endl;
                // return 0;
            }
            if (cmp[a] != cmp[b]) {
                son[cmp[a]].push_back(edge(cmp[b] , w));
                in[cmp[b]]++;
            }
        }
    }

    queue<int>q;
    for (int i = 1;i <= id;i++) {
        if (!in[i])q.push(i) , dp[i] = 1;
    }

    while (q.size()) {
        a = q.front();
        q.pop();

        for (edge e : son[a]) {
            b = e.b , w = e.w;
            in[b]--;
            dp[b] = max(dp[b] , dp[a] + w);
            if (!in[b])q.push(b);
        }
    }
    int ans = 0;
    // for (int i = 1;i <= id;i++)cout << dp[i] << endl;
    for (int i = 1;i <= id;i++) {
        ans += dp[i] * cnt[i];
    }
    cout << ans << endl;

    return 0;
}

//https://blog.csdn.net/weixin_51307520/article/details/126458706
2023/10/26 14:56
加载中...