免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2174 | 回复: 3
打印 上一主题 下一主题

[算法] 求救:有谁知道二分图的匹配算法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-19 08:28 |只看该作者 |倒序浏览
哪位高手会用匈牙利算法求二分图的最大匹配用c语言实现?

论坛徽章:
0
2 [报告]
发表于 2006-05-19 08:53 |只看该作者
二分图的最大匹配不是用最大网络流的算法吗?

论坛徽章:
0
3 [报告]
发表于 2006-05-19 13:23 |只看该作者
去看看图论的书吧,知道原理了就容易实现了
最大流可以做,但不是最好

论坛徽章:
0
4 [报告]
发表于 2006-05-19 14:23 |只看该作者
#include<stdio.h>
#include<string.h>
main()
{
bool map[100][300];
int i,i1,i2,num,num1,que[300],cou,stu,match1[100],match2[300],pque,p1,now,prev[300],n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
  scanf("%d%d",&cou,&stu);
  memset(map,0,sizeof(map));
  for(i1=0;i1<cou;i1++)
  {
   scanf("%d",&num);
   for(i2=0;i2<num;i2++)
   {
    scanf("%d",&num1);
    map[i1][num1-1]=true;
   }
  }
  num=0;
  memset(match1,int(-1),sizeof(match1));
  memset(match2,int(-1),sizeof(match2));
  for(i1=0;i1<cou;i1++)
  {
   p1=0;
   pque=0;
   for(i2=0;i2<stu;i2++)
   {
    if(map[i1][i2])
    {
     prev[i2]=-1;
     que[pque++]=i2;
    }
    else
     prev[i2]=-2;
   }
   while(p1<pque)
   {
    now=que[p1];
    if(match2[now]==-1)
     break;
    p1++;
    for(i2=0;i2<stu;i2++)
    {
     if(prev[i2]==-2&&map[match2[now]][i2])
     {
      prev[i2]=now;
      que[pque++]=i2;
     }
    }
   }
   if(p1==pque)
    continue;
   while(prev[now]>=0)
   {
    match1[match2[prev[now]]]=now;
    match2[now]=match2[prev[now]];
    now=prev[now];
   }
   match2[now]=i1;
   match1[i1]=now;
   num++;
  }
  if(num==cou)
   printf("YES\n");
  else
   printf("NO\n");
}
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP