裸的最小点覆盖数
最小点覆盖数=二分图最大匹配数
// File Name: 3041.cpp // Author: zlbing // Created Time: 2013/2/27 20:35:34 #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 550 vector<int>G[MAXN]; int Left[MAXN]; bool S[MAXN],T[MAXN]; 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,k; while(~scanf("%d%d",&n,&k)) { for(int i=0;i<=n;i++)G[i].clear(); int a,b; for(int i=0;i<k;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",sum); } return 0; }