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