题意:输入A、B机器的总状态和jobs的个数。机器要改变状态就要重启,求最小的重启次数使jobs全部工作。满足A状态或者B状态jobs可以工作
例如输入数据
5 5 10 0 1 1 1 1 2 2 1 3 3 1 4 4 2 1 5 2 2 6 2 3 7 2 4 8 3 3 9 4 30
0 1 1 代表 要执行0 就需要A是1或者 B是1 所以 前四个只要A都是1 那么 0~3 都可以工作...
所以抽象出二分图的最小顶点覆盖,A--B状态建图。求最小顶点覆盖
#include<iostream>
using namespace std;
int link[100];
bool vis[100],g[100][100];
int n,m;
bool dfs(int u)
{
for(int i=1;i<=m;i++)
{
if(!vis[i]&&g[u][i])
{
vis[i]=1;
if(link[i]==-1||dfs(link[i]))
{
link[i]=u;
return true;
}
}
}
return false;
}
int maxmatch()
{
int num=0;
memset(link,-1,sizeof(link));
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i)) num++;
}
return num;
}
int main()
{
int a,b,c;
int k;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
if(n==0) break;
memset(g,0,sizeof(g));
while(k--)
{
scanf("%d%d%d",&a,&b,&c);
g[b][c]=1;
}
printf("%d\n",maxmatch());
}
}