hdu 1083 Courses(二分图匹配 匈牙利算法)

来源:互联网 发布:c语言不等于 编辑:程序博客网 时间:2024/05/16 10:40

很典型的二分图匹配问题。要求 每一门课程 都有一个独一无二的 课代表。换句话说,也就是 每一门课程都要与一个人 一对一的相连。

问,是否存在这样的情况。

以下是代码:

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;int ed[555][555];//邻接矩阵 表示课程y是否与人x有边相连int vis[555];//标记数组,标记第x个人有没有被课程y考虑过 y为传入的课程参数int m;int match[555];//match[x] = y 表示 x号人 是 课程y的课代表bool xiongyali(int x){    int i;    for(i = 1; i <= m ; i++)    {        if(vis[i] == 1 || ed[x][i] == 0)continue;//如果没有边相连或者i已经被之前的课程考虑过那么不进行判断        vis[i] =1 ;//防止下面的递归陷入无限的死循环        if( match[i] == 0 || xiongyali(match[i]))//看能否两者相连        {            match[i] = x;            return true;        }    }    return false;}int main(){    int n,i,j,k,T,x,y,z;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&m);        memset(ed,0,sizeof(ed));        for(i = 1; i <= n; i ++)        {            scanf("%d",&x);            while(x--)            {                scanf("%d",&y);                ed[i][y] = 1;            }        }        int ans = 0;        memset(match,0,sizeof(match));        for(i =1; i <= n; i++)        {            memset(vis,0,sizeof(vis));//注意这边的标记数组每次都要清空            if(xiongyali(i))ans++;//ans 表示边数            else break;        }      if(ans == n)printf("YES\n");      else printf("NO\n");    }    return 0;}


0 0
原创粉丝点击