poj 1469(匈牙利算法)

来源:互联网 发布:js 超出字数省略号 编辑:程序博客网 时间:2024/05/22 00:30
题意 n个学生去p个课堂,每一个学生都有自己的课堂,并且每个学生只能去一个课堂,题目要求能够安排每一个课堂都有人吗?输入数据的第一行是测试数据的个数,每组测试数据的开始分别是p和n,接着p行,每行的开始是这个课堂的学生人数m,接着m个数代表该课堂的学生编号,对于输出,如果该组数据能够这样安排就输出YES,否则输出NO。例如,对于第一组数据明显可以这样匹配,3-3,2-2,1-1,而对于第二组数据则无法找到匹配方案,

#include<stdio.h>
#define N 400
int map[N][N],use[N],link[N],m,n;
void initial()
{
 int i,j;
 for(i=0;i<N;i++)
 {
  for(j=0;j<N;j++)
   map[i][j]=0;
  link[i]=-1;
 }
}
bool dfs(int x){
    int i,j;   
    for(i=1;i<=m;i++){
        if (use[i]==0 && map[x][i]) {
            use[i]=1;
            j=link[i];
            link[i]=x;
            if (j==-1|| dfs(j))
   {
                return true;
            }
            link[i]=j;
        }      
    }
    return false;
}

int hungary()
{
 int num=0;
    int i,j;
 for(i=1;i<=n;i++)
 {
  for(j=1;j<=m;j++)
   use[j]=0;
  if (dfs(i))
   num++;
 }
 return num;
}


int main()
{
 int t,number,i,j,v,x;
 
 scanf("%d",&t);
 
 while(t--)
 {
  
  initial();
  scanf("%d%d",&n,&m);
  
  for(i=1;i<=n;i++)
  {
   scanf("%d",&number);
   for(j=1;j<=number;j++)
   {
    scanf("%d",&v);
    map[i][v]=1;
   }
  }
  x=hungary();
  
  if(x==n)
   printf("YES\n");
  else
            printf("NO\n");
 } 
 return  0;
}

原创粉丝点击