求助,方案输出错误
查看原帖
求助,方案输出错误
694274
yugen楼主2024/5/14 15:31

为什么EK()函数中求出的(x,y)会出错啊,我的想法是找终点T的前一个点作为y,找起点S的后一个点作为x,(x,y)为一组,但这样做只拿了63pts。

// 在二分图里跑最大流 dinic:O(sqrt(n) * m)
#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;

const int N = 110;

struct E {
    int v, cap, ne;
} edge[N * N];

int n, m, S, T;
int h[N], idx = 1;
int mf[N], pre[N], flow;
std::vector<pii> ans;

void add(int a, int b, int c) {
    edge[++ idx] = {b, c, h[a]};
    h[a] = idx;
}

bool bfs() {
    memset(mf, 0, sizeof(mf));
    mf[S] = 1e9;
    queue<int> q;
    q.push(S);
    while(q.size()) {
        int u = q.front();
        q.pop();
        for(int i = h[u]; i; i = edge[i].ne) {
            ll v = edge[i].v;
            if(mf[v] == 0 && edge[i].cap) {
                mf[v] = min(mf[u], edge[i].cap);
                pre[v] = i;
                q.push(v);
                if(v == T) return true;
            }
        }
    }
    return false;
}

void EK() {
    while(bfs()) {
        int v = T;
        int x, y;
        while(v != S) {
            int i = pre[v];
            edge[i].cap -= mf[T];
            edge[i ^ 1].cap += mf[T];
            if(v == T) {
                y = edge[i ^ 1].v;
            }
            if(edge[i ^ 1].v == S) {
                x = v;
            }
            v = edge[i ^ 1].v;
        }
        flow ++ ;
        ans.push_back({x, y});
    }
}

void solve() {
    cin >> m >> n;
    while(1) {
        int u, v;
        cin >> u >> v;
        if(u == -1 && v == -1) {
            break;
        }
        add(u, v, 1);
        add(v, u, 0);
    }
    S = n + 1, T = n + 2;
    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);
    }
    EK();
    cout << flow << '\n';
    for(auto [x, y] : ans) {
        cout << min(x, y) << ' ' << max(x, y) << '\n';
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    
    int t = 1;
    // cin >> t;
    while(t -- ) {
        solve();
    }

    return 0;
}
2024/5/14 15:31
加载中...