有两台机器A和B以及N个需要运行的任务。每台机器有M种不同的模式,而每个任务都恰好在一台机器上运行。如果它在机器A上运行,则机器A需要设置为模式xi,如果它在机器B上运行,则机器A需要设置为模式yi。每台机器上的任务可以按照任意顺序执行,但是每台机器每转换一次模式需要重启一次。请合理为每个任务安排一台机器并合理安排顺序,使得机器重启次数尽量少。
所以这题求的是 二分图的最小覆盖点(用最小的点 联结所有的边)
最小覆盖点==最大匹配数
一开始为机器状态为0 所以0无需任何代价 不需要计算在内
#include<bits/stdc++.h> using namespace std; int mp[105][105]; int used[106]; int vis[105];//记录的是匹配情况 int n,m; bool find1(int x) { for(int j=1;j<m;j++)//从1开始是因为0不需要计算在内 { if(mp[x][j]&&!used[j]) { used[j]=1; if(!vis[j]||find1(vis[j])) { vis[j]=x; return true; } } } return false; } int main() { int k,cas,x,y; while(scanf("%d",&n),n) { memset(mp,0,sizeof(mp)); memset(vis,0,sizeof(vis)); scanf("%d%d",&m,&k); while(k--) { scanf("%d%d%d",&cas,&x,&y); mp[x][y]=1; } int ans=0; for(int i=1;i<n;i++) { memset(used,0,sizeof(used));//每次的使用 需要清除 if(find1(i))ans++; } printf("%d ",ans); } }