hungarian.cpp (2)

Bài viết này không còn hiệu quả, hãy xem bài viết mới hơn:

https://sites.google.com/site/kc97ble/algorithm-graph/cap-ghep-tren-do-thi-hai-phia-khong-trong-so

Bài toán

Tìm cặp ghép cực đại trên đồ thị hai phía không trọng số.

Độ phức tạp

O(m.n2)

Code này của Nguyễn Tiến Trung Kiên

#include <stdio.h>

#include <vector>

#include <iostream>

#include <algorithm>

using namespace std;

#define f1(i,n) for (int i=1; i<=n; i++)

#define N 202

int n, t;

vector<int> a[N];

int Visited[N];

int Assigned[N];

bool visit(int u){

    Visited[u]=t;

    for (int i=0,v; v=a[u][i]; i++)

    if ( !Assigned[v] || (Visited[Assigned[v]]!=t && visit(Assigned[v])) ) {

        Assigned[v]=u;

        Assigned[u]=v;

        return true;

    }

    return false;

}

void enter(){

    int p, q;

    cin >> p >> q;

    n=max(p,q);

    while (cin >> p >> q){

        a[p].push_back(q+n);

        a[q+n].push_back(p);

    }

    f1(i,2*n) a[i].push_back(0);

}

main(){

    ios :: sync_with_stdio(false);

    enter();

    f1(i,n) if (!Assigned[i]) { t++; visit(i); } // Left-only

    

    int Answer=0;

    f1(i,n) if (Assigned[i]) Answer++;

    cout << Answer << endl;

    f1(i,n) if (Assigned[i]) cout << i << " " << Assigned[i]-n << endl;

}

Tính chất

Assigned[u]=v và v!=0 thì Assigned[v]=u.

Nhận xét

Code này đã được dùng để nộp cho một bài trên SPOJ.

Tham khảo

vn.spoj.com/problems/MATCH1/