萌新初学EK求调
查看原帖
萌新初学EK求调
469309
凤年楼主2023/3/22 16:11

rt,输出配对情况挂了

#include <bits/stdc++.h>
#include <windows.h>
#define N 6000
#define M 6000
using namespace std;

int n, m, s, t, head[N], tot = 1, ans;
struct edge{int nex,to,val, from;}e[M << 1];
void add(int u,int v,int w) {

    e[++tot].to = v;
    e[tot].from = u;
    e[tot].val = w;
    e[tot].nex = head[u];
    head[u] = tot;
}

bool vis[N];
struct P{int v, e;}pre[N];

bool bfs() {
    queue<int>q;
    memset(vis, false, sizeof(vis));
    memset(pre, -1, sizeof(pre));

    pre[s].v = s;
    vis[s] = true;
    q.push(s);
    while(!q.empty()) {
        int now = q.front();
        q.pop();
        for(int i = head[now]; i; i = e[i].nex) {
            int to = e[i].to;
            if(vis[to] || !e[i].val) continue;
            pre[to] = {now, i};
            if(to == t) return true;
            vis[to] = true;
            q.push(to);
        }
    }
    return false;
}

int EK() {
    int ans = 0;
    while(bfs()) {
        int mn = 2e9;
        for(int i = t; i != s; i = pre[i].v)
            mn = min(mn, e[pre[i].e].val);
        for(int i = t; i != s; i = pre[i].v) {
            e[pre[i].e].val -= mn;
            e[pre[i].e^1].val += mn;
        }
        ans += mn;
        // for(int i = 2 * n + 2, cnt = 0;i <= tot; i += 2) {
        // if(pre[i].v == -1) continue;
            // if(e[i].val) printf("e[%d].val = %d -> %d %d\n", i, e[i].val, e[i].from, e[i].to);
        // if(e[i].val)    printf("%d %d\n", e[i].from, e[i].to);
        // }
        // Sleep(3000);
    }
    return ans;
}

int main() {
    scanf("%d %d", &m, &n);
    s = 0, t = n + 1;
    for(int i = 1;i <= m; ++i) {
        add(s, i, 1);
        add(i, s, 0);
    }
    for(int i = m + 1;i <= n; ++i) {
        add(i, t, 1);
        add(t, i, 0);
    }

    for(int i = 1, u, v; ; ++i) {
        scanf("%d %d", &u, &v);
        if(u == -1 && v == -1) break;
        add(u, v, 1);
        add(v, u, 0);
    }
    ans = EK();
    printf("%d\n", ans); 
    for(int i = 2 * n + 2;i <= tot; i += 2) {
        // if(pre[i].v == -1) continue;
        if(e[i].val) printf("%d %d\n", e[i].from, e[i].to);
        // if(e[i].val)    printf("%d %d\n", e[i].from, e[i].to);
    }
    return 0;
}
2023/3/22 16:11
加载中...