您的位置:首页 > 其它

poj 1469(匈牙利算法)

2012-08-23 09:43 190 查看
题意 n个学生去p个课堂,每一个学生都有自己的课堂,并且每个学生只能去一个课堂,题目要求能够安排每一个课堂都有人吗?输入数据的第一行是测试数据的个数,每组测试数据的开始分别是p和n,接着p行,每行的开始是这个课堂的学生人数m,接着m个数代表该课堂的学生编号,对于输出,如果该组数据能够这样安排就输出YES,否则输出NO。例如,对于第一组数据明显可以这样匹配,3-3,2-2,1-1,而对于第二组数据则无法找到匹配方案,
#include<stdio.h>

#define N 400

int map

,use
,link
,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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 测试 ini