POJ1274匈牙利算法DFS实现

来源:互联网 发布:聚翔网络 编辑:程序博客网 时间:2024/05/01 14:06

题意:

     有n头牛与m个牛棚,给出每头牛愿意去产奶的牛棚编号,每头牛只可产一次奶,每个牛棚也只允许一只牛产奶。

解法:

    比较简单的二分图最大匹配。优点:实现简洁容易理解,适用于稠密图,DFS找增广路快。

    找一条增广路的复杂度O(E),最多找V条增广路,故时间复杂度为O(VE)。

#include<stdio.h>#include<string.h>#define MAXN 250int uN,vN;int g[MAXN][MAXN];int xM[MAXN],yM[MAXN];int chk[MAXN];int searchPath(int u){    int v;    for(v=0;v<vN;++v)        if(g[u][v]&&!chk[v]){            chk[v]=1;            if(yM[v]==-1||searchPath(yM[v])){                yM[v]=u;                xM[u]=v;                return 1;            }        }    return 0;}int maxMatch(){    int u,ret=0;    memset(xM,-1,sizeof(xM));    memset(yM,-1,sizeof(yM));    for(u=0;u<uN;++u)        if(xM[u]==-1){            memset(chk,0,sizeof(chk));            if(searchPath(u)) ++ret;        }    return ret;}int main(){//    freopen("in.txt","r",stdin);    int i,j,num,tmp;    while(~scanf("%d%d",&uN,&vN)){        memset(g,0,sizeof(g));        for(i=0;i<uN;++i){            scanf("%d",&num);            for(j=0;j<num;++j){                scanf("%d",&tmp);                g[i][tmp-1]=1;            }        }        printf("%d\n",maxMatch());    }    return 0;}


0 0