hdu 1150 二分图的最大匹配 hopcroft-karp算法

来源:互联网 发布:紫金银交易软件 编辑:程序博客网 时间:2024/06/06 04:35
///hopcroft-karp#include<iostream>#include<queue>#include<cstring>using namespace std;const int maxn = 200;const int inf = 65535;int Mx[maxn], My[maxn];bool vis[maxn];int g[maxn][maxn];int dx[maxn], dy[maxn];int n, m;int search(){    queue<int>q;    int dis = inf;    memset(dx, -1, sizeof(dx));    memset(dy, -1, sizeof(dy));    while(!q.empty()) q.pop();    for(int i=1; i<=n; i++){        if(Mx[i] == -1){            q.push(i);            dx[i] = 0;        }    }    while(!q.empty()){        int u = q.front();        q.pop();        if(dx[u] > dis)            break;        for(int v=1; v<=m; v++){            if(g[u][v] && dy[v] == -1){                dy[v] = dx[u] + 1;                if(My[v] == -1){                    dis = dy[v];                }                else{                    dx[My[v]] = dy[v] + 1;                    q.push(My[v]);                }            }        }    }    return dis<inf;}int dfs(int u){    for(int v=1; v<=m; v++){        if(g[u][v] && !vis[v] && dy[v] == dx[u] + 1){            vis[v] = true;            if(My[v] == -1 || dfs(My[v])){                My[v] = u;                Mx[u] = v;                return 1;            }        }    }    return 0;}int hungary(){    int ans = 0;    memset(Mx, -1, sizeof(Mx));    memset(My, -1, sizeof(My));    while(search()){        for(int u=1; u<=n; u++){            memset(vis, false, sizeof(vis));            if(Mx[u] == -1){                if(dfs(u))                    ans ++;            }        }    }    return ans;}int main(){    int k;    while(cin >> n && n){        cin >> m >> k;        memset(g, 0, sizeof(g));        int j, u, v;        for(int i=0; i<k; i++){            cin >> j >> u >> v;            g[u][v] = 1;        }        int ans = hungary();        cout << ans << endl;    }    return 0;}


 

0 0
原创粉丝点击