//hdu 1151
//访问小镇最多需要几个士兵,每个士兵的路无交点,实际上就是求有向无环图的最小路径覆盖
//最小路径覆盖(不要求二分图):在图中找一些路径,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联
//最小路径覆盖 = 顶点数 - 最大匹配数
//对于有向无环图,首先拆点,建成二分图再进行求解
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=150;
int n,m,k;
int g[N][N];
struct Hungary{
int line[N],vis[N];
void init(){
memset(line,-1,sizeof(line));
}
bool dfs(int u,int n){
for(int i=0;i<n;i++){
if(!vis[i]&&g[u][i]){
vis[i]=1;
if(line[i]==-1||dfs(line[i],n)){
line[i]=u;
return 1;
}
}
}
return 0;
}
int Max_match(int n){
int all=0;
for(int i=0;i<n;i++){
memset(vis,0,sizeof(vis));
if(dfs(i,n))all+=1;
}
return all;
}
};
Hungary huy;
int main(){
int T;
scanf("%d",&T);
while(T--){
int n,m;
memset(g, 0, sizeof(g));
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
int u,v;
scanf("%d%d",&u,&v);
u--;v--;
g[u][v]=1;
}
huy.init();
printf("%d\n",n-huy.Max_match(n));
}
return 0;
}
hdu1151 air Raid(最小路径覆盖)
最新推荐文章于 2019-07-21 21:11:58 发布