您的位置:首页 > 其它

poj 1325 二分图最小顶点覆盖(机器重启)

2012-03-03 21:07 399 查看
题意:输入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 3

0

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());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: