zju 1525 Air Raid(最小路径覆盖)

来源:互联网 发布:tsc标签设计软件 编辑:程序博客网 时间:2024/05/29 19:04
#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;}