HDU 1150

又一二分图题,虽然从题目不能直接看出来,但题目意思是求出最小重启次数,即找出最少的点将所有工作覆盖,即二分图的最小点覆盖。

最小点覆盖=最大匹配,所以直接是匈牙利算法,机器A、B分别看作二分图左右顶点,边表示可完成工作的两种模式。

 1 //最小点覆盖=最大匹配 
 2 
 3 #include<stdio.h>
 4 #include<stdlib.h>
 5 #include<string.h>
 6 #define max 510
 7 
 8 int stu[max][max],visit[max],linker[max],n,m,i,j,k,res;
 9 
10 bool dfs(int i){
11     int j;
12     for(j=n;j<n+m;j++){
13         if(stu[i][j]==1&&visit[j]==0){
14             visit[j]=1;
15             if(linker[j]==-1||dfs(linker[j])){
16                 linker[j]=i;
17                 return true;
18             }
19         }
20     }
21     return false;
22 }
23 
24 int main(){
25     while(scanf("%d",&n)!=EOF&&n!=0){
26         scanf("%d%d",&m,&k);
27         memset(stu,0,sizeof(stu));
28         memset(linker,-1,sizeof(linker));
29         res=0;
30         while(k){
31             scanf("%d%d%d",&i,&i,&j);
32             stu[i-1][j+n-1]=1;   //从0开始
33             k--; 
34         }
35         for(i=0;i<n;i++){
36             memset(visit,0,sizeof(visit));
37             if(dfs(i)) res++;
38         }
39         printf("%d\n",res);
40     }
41     return 0;
42 }
View Code

 

posted @ 2015-10-06 13:51  生长努力的菜  阅读(108)  评论(0编辑  收藏  举报