HDU-1150(求最小覆盖顶点数=二分最大匹配数)

来源:互联网 发布:我尼玛知乎 编辑:程序博客网 时间:2024/05/22 13:49

关于这道题目,我也是迷迷糊糊的,上网找资料也是看不懂,,,,  到底 为什么最小覆盖顶点数=二分最大匹配数,自己也确实弄得不是很清楚,反正这个好像是前人已经证明了的,所以自己还是可以拿来用的,

至于彻底弄懂的话还是等以后有机会的时候去问问别人吧,,,,

就是一个简单的匈牙利算法 另外就是多了个判断条件就是判断这个点的状态是不是MOD_0 如果是的话 ,到最后还 是得减去1的,,,,

贴出代码:

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>int N,M,K;int map[105][105];int visit[105];int link[105];int getnum(int x){for(int i=0;i<M;i++){if(!visit[i]&&map[x][i]){visit[i]=1;if(!link[i]||getnum(link[i])){link[i]=x;return 1;}}}return 0;}int main(){while(scanf("%d",&N),N){int a,b,t;int count=0;int flag=0;memset(map,0,sizeof(map));memset(link,0,sizeof(link));scanf("%d%d",&M,&K);for(int i=0;i<K;i++){scanf("%d%d%d",&t,&a,&b);if(!a||!b)flag=1;map[a][b]=1;}for(i=0;i<N;i++){memset(visit,0,sizeof(visit));if(getnum(i))count++;}if(!flag)printf("%d\n",count);elseprintf("%d\n",count-1);}return 0;}


 

原创粉丝点击