poj 3041 第一题二分图最大匹配

布满荆棘的人生 2021-09-17 14:46 360阅读 0赞
  1. [http://imlazy.ycool.com/post.1603708.html][http_imlazy.ycool.com_post.1603708.html]看了这能很好的理解二分图的最大匹配问题。
  2. 这题要会把rowcol转换成为两个顶点集,(x,y)看成边。问题就转化成为选择最少的一些点(xy),使得从这些点与所有的边相邻,其实这就是最小点覆盖问题。在二分图中,**最小点覆盖数=最大匹配数。**所以可以用匈牙利算法解决。
  3. 二分图最大匹配的匈牙利算法看了好久,现在终于有点眉目了。加油哟!!

2012050100392810.png

  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. #define MAXN 501
  5. int N,K;
  6. bool map[MAXN][MAXN],v[MAXN];
  7. int link[MAXN];
  8. bool dfs(int x)
  9. {
  10. int i;
  11. for(i=1; i<=N; i++)
  12. {
  13. if(!v[i] && map[x][i])
  14. {
  15. v[i]=true;
  16. if(link[i]==0 || dfs(link[i]))
  17. {
  18. link[i]=x;
  19. return true;
  20. }
  21. }
  22. }
  23. return false;
  24. }
  25. int main()
  26. {
  27. int i,result=0;
  28. memset(map,false,sizeof(map));
  29. memset(link,0,sizeof(link));
  30. freopen("acm.txt","r",stdin);
  31. scanf("%d%d",&N,&K);
  32. for(i=1; i<=K; i++)
  33. {
  34. int a,b;
  35. scanf("%d%d",&a,&b);
  36. map[a][b]=true;
  37. }
  38. for(i=1; i<=N; i++)
  39. {
  40. memset(v,false,sizeof(v));
  41. if(dfs(i))
  42. result++;
  43. }
  44. printf("%d\n",result);
  45. return 0;
  46. }

发表评论

表情:
评论列表 (有 0 条评论,360人围观)

还没有评论,来说两句吧...

相关阅读

    相关 [二分]匹配

    二分图的定义,以及判断图是否为二分图都很简单了。 现在要说二分图的最大匹配。 首先是定义吧,完美匹配就是一一对应,而最大匹配则是最大可以匹配的条数 完美匹配一定是最大匹配