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;
}

你可能感兴趣的:(poj)