#include<iostream>
#include<cstring>
using namespace std;
#define MAX_N 121
//有向图最小路径覆盖=|V| - 最大匹配数; 无向图最小路径覆盖=|V| - 最大匹配数/2。
bool map[MAX_N][MAX_N],use[MAX_N];
int path[MAX_N];
bool Match(int n,int p){ //递归寻找增广路
for(int i=1;i<=n;i++){
if(!use[i] && map[p][i]){
use[i]=true;
if(!path[i] || Match(n,path[i])){ //往上个节点找,直到找到能够匹配的
path[i]=p; //标记为父节点
return true;
}
}
}
return false;
}
int Maxmatch(int n){
memset(path,0,sizeof(path)); //连接二分图
int sumMatch=0;
for(int i=1;i<=n;i++){
memset(use,false,sizeof(use));
if(Match(n,i))//直到找到二分图的另一,匹配数++;
sumMatch++;
}
return sumMatch;
}
int main(){
int T,n,m;
cin>>T;
while(T--){
cin>>n>>m;
memset(map,false,sizeof(map));
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
map[a][b]=true;
}
int minpath=n-Maxmatch(n);
cout<<minpath<<endl;
}
return 0;
}
zju 1525 Air Raid(最小路径覆盖)
最新推荐文章于 2017-08-04 20:13:35 发布