又一二分图题,虽然从题目不能直接看出来,但题目意思是求出最小重启次数,即找出最少的点将所有工作覆盖,即二分图的最小点覆盖。
最小点覆盖=最大匹配,所以直接是匈牙利算法,机器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 }
时间: 2024-10-13 01:22:54