POJ 1325题
类型:二分图中最小顶点覆盖问题
题目大意:两台机器A,B,A有n个模式,B有m个模式,现在有k个工作,其中每一个工作可以由A或B中的一个特定模式来完成,
但是切换机器的模式要重新启动一次,问最少要重启多少次机器才能完成所有工作?
解题思路:A,B两台机器构成一个二分图,在之间按照给出的条件连边。这样想,每一个工作其实是由一条边来代表的,那么
我们只要用最少的顶点来覆盖所有的边即可。这就是最小覆盖。
根据公式:最小覆盖=最大匹配;对原二分图做一次最大匹配即可。
#include <iostream>
//#include <conio.h>
using namespace std;
#define arraysize 101
int map[arraysize][arraysize];
bool final[arraysize];
int match[arraysize];
int n,m,k;
bool DFS(int p)
{
int i,j;
int temp;
for(i=1;i<m;++i)
{
if(map[p][i] && !final[i])
{
final[i] = true;
temp = match[i];
match[i] = p;
if(temp == 0 || DFS(temp)) return true;
match[i] = temp;
}
}
return false;
}
int mat()
{
int i,j;
int maxmatch = 0;
for(i=1;i<n;++i)
{
memset(final,0,sizeof(final));
if(DFS(i)) maxmatch++;
}
return maxmatch;
}
int main()
{
//freopen("1.txt","r",stdin);
int i,j;
int mode,x,y;
while(cin>>n)
{
memset(map,0,sizeof(map));
memset(match,0,sizeof(match));
if(n==0)
break;
cin>>m>>k;
for(i=0;i<k;++i)
{
cin>>mode>>x>>y;
map[x][y] = 1;
}
cout<<mat()<<endl;
}
//getch();
return 0;
}