题意:有两台机器A和B以及N个需要运行的任务。每台机器有M种不同的模式,而每个任务都恰好在一台机器上运行。如果它在机器A上运行,则机器A需要设置为模式xi,如果它在机器B上运行,则机器A需要设置为模式yi。每台机器上的任务可以按照任意顺序执行,但是每台机器每转换一次模式需要重启一次。请合理为每个任务安排一台机器并合理安排顺序,使得机器重启次数尽量少。初始时是模式0.
二分图的最小顶点覆盖数=最大匹配数
本题就是求最小顶点覆盖数的。
#include<iostream> #include<string.h> using namespace std; #define MAXN 110 int match[MAXN]; bool mark[MAXN],map[MAXN][MAXN]; int n,m; bool DFS(int p) { int i,t; for( i=1; i<m; i++){ if( !mark[i]&&map[p][i]){ mark[i]=true; t=match[i]; match[i]=p; if( t==-1||DFS(t)) return true; match[i]=t; } } return false; } int maxMah() { int ans; ans=0; memset(match,-1,sizeof(match)); for(int i=1; i<n; i++){ memset(mark,false,sizeof(mark)); if( DFS(i)) ans++; } return ans; } int main() { int i,x,y,k; while( scanf("%d",&n)&&n){ scanf("%d%d",&m,&k); memset(map,false,sizeof(map)); while( k--){ scanf("%d%d%d",&i,&x,&y); if( x&&y) map[x][y]=true; } printf("%d\n",maxMah()); } return 0; }