POJ 1422(可作为最小路径覆盖的模板)

//题目大意:城市之间单向相连,无环!问最少用多少个伞兵能遍历这张图。
//题目类型:典型的最小路径覆盖问题,根据定理:最小路径覆盖=顶点数-最大匹配数
1.用匈牙利算法求二分匹配,利用最小路径覆盖=顶点总数-最大匹配
2.把每个点拆点为出点和入点
#include <iostream>
//#include <conio.h>
using namespace std;
#define arraysize 121
int map[arraysize][arraysize];
bool final[arraysize];
int match[arraysize];
int inter,street;
bool DFS(int p)
{
    int i,j;
    int temp;
    for(i=1;i<inter+1;++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<inter+1;++i)
    {
        memset(final,0,sizeof(final));
        if(DFS(i)) maxmatch++;
    }
    return maxmatch;
}
int main()
{
    //freopen("1.txt","r",stdin);
    int testcase;
    int start,end;
    int i,j;
    cin>>testcase;
    while(testcase--)
    {
       cin>>inter>>street;
       memset(match,0,sizeof(match));
       memset(map,0,sizeof(map));
       for(i=0;i<street;++i)
       {
           cin>>start>>end;
           map[start][end] = 1;
       }
       cout<<inter-mat()<<endl;  //顶点数-最大匹配数
    }
    //getch();
    return 0;
}

posted @ 2010-05-06 22:45  北海小龙  阅读(534)  评论(0编辑  收藏  举报