裸的最小路径覆盖
最小路径覆盖=顶点数-二分图最大匹配
// File Name: 1422.cpp // Author: zlbing // Created Time: 2013/2/27 19:20:35 #include<iostream> #include<string> #include<algorithm> #include<cstdlib> #include<cstdio> #include<set> #include<map> #include<vector> #include<cstring> #include<stack> #include<cmath> #include<queue> using namespace std; #define CL(x,v); memset(x,v,sizeof(x)); #define INF 0x3f3f3f3f #define MAXN 150 vector<int>G[MAXN]; int Left[MAXN]; bool S[MAXN],T[MAXN]; int P,N; bool match(int i) { S[i]=true; for(int j=0;j<G[i].size();j++) { int v=G[i][j]; if(T[v])continue; T[v]=true; if(Left[v]==0||match(Left[v])) { Left[v]=i; return true; } } return false; } int main(){ int n,m; int N; scanf("%d",&N); while(N--) { scanf("%d%d",&n,&m); for(int i=0;i<=n;i++)G[i].clear(); int a,b; for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); G[a].push_back(b); } CL(Left,0); int sum=0; for(int i=1;i<=n;i++) { CL(S,0); CL(T,0); if(match(i))sum++; } printf("%d\n",n-sum); } return 0; }