题目大意;有两台机器A和B以及N个需要运行的任务。每台机器有M种不同的模式,而每个任务都恰好在一台机器上运行。如果它在机器A上运行,则机器A需要设置为模式xi,如果它在机器B上运行,则机器A需要设置为模式yi。每台机器上的任务可以按照任意顺序执行,但是每台机器每转换一次模式需要重启一次。请合理为每个任务安排一台机器并合理安排顺序,使得机器重启次数尽量少。
注意状态为0的即可
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 const int MAXN = 510; 6 int uN,vN;//u,v的数目,使用前面必须赋值 7 int g[MAXN][MAXN];//邻接矩阵 8 int linker[MAXN]; 9 bool used[MAXN]; 10 bool dfs(int u) 11 { 12 for(int v = 0; v < vN;v++) 13 if(g[u][v] && !used[v]) 14 { 15 used[v] = true; 16 if(linker[v] == -1 || dfs(linker[v])) 17 { 18 linker[v] = u; 19 return true; 20 } 21 } 22 return false; 23 } 24 int hungary() 25 { 26 int res = 0; 27 memset(linker,-1,sizeof(linker)); 28 for(int u = 0;u < uN;u++) 29 { 30 memset(used,false,sizeof(used)); 31 if(dfs(u))res++; 32 } 33 return res; 34 } 35 int main() 36 { 37 int i,j,k; 38 //freopen("1.in","r",stdin); 39 while(scanf("%d",&uN)!=EOF) 40 { 41 if(uN==0) break; 42 scanf("%d%d",&vN,&k); 43 int p,q; 44 memset(g,0,sizeof(g)); 45 while(k--) 46 { 47 scanf("%d%d%d",&i,&p,&q); 48 if(p>0&&q>0) g[p][q]=1; 49 } 50 printf("%d\n",hungary()); 51 } 52 return 0; 53 }
时间: 2024-10-15 07:08:15