题意:
有两台机器A和B以及N个需要运行的任务。每台机器有M种不同的模式,而每个任务都恰好在一台机器上运行。如果它在机器A上运行,则机器A需要设置为模式ai,如果它在机器B上运行,则机器A需要设置为模式bi。每台机器上的任务可以按照任意顺序执行,但是每台机器每转换一次模式需要重启一次。请合理为每个任务安排一台机器并合理安排顺序,使得机器重启次数尽量少。
要找的就是最多能连几根线,当然每个点只能用一次
此题所求直接就是最大匹配数
一般二分图匹配有三个问题
(1):求最小顶点覆盖=最大匹配数
(2):求最小路径覆盖=节点数-最大匹配数
(3):求最大独立集数,分两种,一种两边点重复的,节点数-最大匹配数/2
一种一边n个点,一边m个点,n+m-最大匹配数
这三类题在我博客中都有
题目链接:点击打开链接
代码注释:
<span style="font-size:18px;color:#ff6600;"><strong>#include<iostream>
#include<cstring>
using namespace std;
#define N 105
int n,m,k;
int a[N][N],visit[N],link[N];//a[][]存地图 visit[]是否被访问 link[]存与之关联的点
bool dfs(int u)
{
int v;
for(v=1; v<m; v++)
if(a[u][v]&&!visit[v]) //两点有关联切该点未被访问
{
visit[v]=1;
if(link[v]==-1||dfs(link[v])) //如果该点没有与其他点关联或者 与之关联的点 由递归可以找到其他点与之相连
{
link[v]=u;
return true;
}
}
return false;
}
int hungary()
{
int u,s=0;
memset(link,-1,sizeof(link));
for(u=1; u<n; u++)
{
memset(visit,0,sizeof(visit));
if(dfs(u))
s++;
}
return s;
}
int main()
{
while(cin>>n,n)
{
cin>>m>>k;
int id,x,y;
memset(a,0,sizeof(a));
while(k--)
{
cin>>id>>x>>y;
if(x&&y)
a[x][y]=1; //有关联置为1
}
cout<<hungary()<<endl;
}
}</strong></span>