题意:机器A有n(0~n-1)个模式,机器B有m(0~m-1)个模式。有k个任务,可以用机器A的i模式做或用机器B的j模式做。任务无先后,换模式需重启机器,开始时两个机器都在模式0,且已经开机。问最少需要开机多少次。
思路:求最小点覆盖。最小点覆盖=最大匹配。故为hungary模板。注意可以用两个机器模式0做的就不必考虑了。
#include <stdio.h> #include <string.h> #define N 105 #define M 1005 int map[N][N]; int visited[N],link[N]; int n,m,k; int dfs(int i){ int j; for(j = 0;j<m;j++) if(!visited[j] && map[i][j]){ visited[j] = 1; if(link[j]==-1 || dfs(link[j])){ link[j] = i; return 1; } } return 0; } int hungary(){ int i,res=0; for(i = 0;i<n;i++){ memset(visited,0,sizeof(visited)); if(dfs(i)) res++; } return res; } int main(){ freopen("a.txt","r",stdin); while(scanf("%d",&n)&&n){ int i,a,b; memset(map,0,sizeof(map)); memset(link,-1,sizeof(link)); scanf("%d %d",&m,&k); while(k--){ scanf("%d %d %d",&i,&a,&b); if(a&&b) map[a][b] = 1; } printf("%d\n",hungary()); } return 0; }