最长反链板子 88 pts 求调。
查看原帖
最长反链板子 88 pts 求调。
714254
tder楼主2024/4/9 10:21
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 5, M = 100 + 5, INF = 1e18;
namespace Dinic {
    int n1, n2, n, s, t, cnt = 1, h[N], d[N], v[N], ans, f[N];
    struct Node {
        int v, w, h;
    } e[N];
    void make(int u, int v, int w = 1) {
        // cout<<"make("<<u<<", "<<v<<", "<<w<<", "<<h[u]<<", "<<cnt<<")"<<endl;
        e[++cnt] = {v, w, h[u]}; h[u] = cnt;
        // cout<<"make("<<v<<", "<<u<<", "<<0<<", "<<h[v]<<", "<<cnt<<")"<<endl;
        e[++cnt] = {u, 0, h[v]}; h[v] = cnt;
    }
    void add(int u, int v, int w = 1) {
        make(u, v + n1, w);
    }
    bool bfs() {
        for(int i = 1; i <= n; i++) d[i] = INF;
        queue<int> q;
        q.push(s); d[s] = 0; f[s] = h[s];
        while(!q.empty()) {
            int x = q.front(); q.pop();
            for(int i = h[x]; i; i = e[i].h) {
                int p = e[i].v;
                if(e[i].w > 0 && d[p] == INF) {
                    q.push(p);
                    d[p] = d[x] + 1; f[p] = h[p];
                    if(p == t) return 1;
                }
            }
        }
        return 0;
    }
    int dfs(int x, int l) {
        if(x == t) return l;
        int k, r = 0;
        for(int i = f[x]; i && l; i = e[i].h) {
            f[x] = i;
            int p = e[i].v;
            if(e[i].w > 0 && d[p] == d[x] + 1) {
                k = dfs(p, min(l, e[i].w));
                if(!k) d[p] = INF;
                e[i].w -= k; e[i ^ 1].w += k;
                r += k, l -= k;
            }
        }
        return r;
    }
    void init(int nn1, int nn2) {
        ans = 0;
        n1 = nn1, n2 = nn2;
        memset(h, 0, sizeof(h)); memset(d, 0, sizeof(d)); memset(v, 0, sizeof(v)), memset(f, 0, sizeof(f));
        n = n1 + n2 + 2; s = n - 1, t = n;
    }
    int dinic() {
        while(bfs()) {
            int x;
            while((x = dfs(s, INF))) ans += x;
        }
        return ans;
    }
}
int n, m, a[N], l[N], r[N], d[N];
bitset<M> b[N];
void dfs(int x) {
    r[x] = 1;
    for(int i = 1; i <= n; i++) if(b[i][x] && !l[i]) {
        l[i] = 1;
        dfs(a[i]);
    }
}
signed main() {
    cin>>n>>m;
    for(int i = 1; i <= m; i++) {
        int u, v; cin>>u>>v;
        b[u][v] = 1;
    }
    for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) if(b[i][j]) b[i] |= b[j];
    Dinic::init(n, n);
    for(int i = 1; i <= n; i++) Dinic::make(n * 2 + 1, i), Dinic::make(i + n, n * 2 + 2);
    for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) if(b[i][j]) Dinic::add(i, j);
    int ans = n - Dinic::dinic();
    cout<<ans<<endl;
    for(int i = 1; i <= n; i++) if(!Dinic::e[i * 4 - 2].w) 
        for(int j = Dinic::h[i]; j; j = Dinic::e[j].h) if(!Dinic::e[j].w) {
            a[i] = Dinic::e[j].v - n;
            break;
        }
    for(int i = 1; i <= n; i++) if(Dinic::e[i * 4].w) dfs(i);
    for(int i = 1; i <= n; i++) cout<<(!l[i] && r[i]); cout<<endl;
    for(int k = 1; k <= n; k++) {
        memset(d, 0, sizeof(d)); int cnt = 0;
        for(int i = 1; i <= n; i++) d[i] = (i == k || b[i][k] || b[k][i]);
        Dinic::init(n, n);
        for(int i = 1; i <= n; i++) if(!d[i]) {
            Dinic::make(n * 2 + 1, i), Dinic::make(i + n, n * 2 + 2);
            cnt++;
        }
        for(int i = 1; i <= n; i++) if(!d[i])
            for(int j = 1; j <= n; j++) if(!d[j])
                if(b[i][j]) Dinic::add(i, j);
        cout<<(cnt - Dinic::dinic() == ans - 1);
    }
    cout<<endl;
    return 0;
}

WA on #7 ~ #9,最后一问的问题。

2024/4/9 10:21
加载中...