首先解释一下什么是最小点覆盖集,存在这样一个最少点集使得图中所有的边至少有一个顶点在该集合中。因为最小点覆盖集=最大二分匹配所以这道题可以转化为最大二分匹配问题。。。。证明过程
http://www.matrix67.com/blog/archives/116
#include<iostream> #include<vector> #include<string.h> #define N 501 using namespace std; vector<int>a[N]; int match[N]; bool flag[N]; bool dfs(int i) { for(int j=0;j<a[i].size();++j) { int u=a[i][j]; if(!flag[u]) { flag[u]=true; if(match[u]==-1||dfs(match[u])) {match[u]=i; return true; } } } return false; } int main() { int Case; cin>>Case; while(Case--) { int n,k; cin>>n>>k; for(int i=0;i<N;++i) a[i].clear(); for(int i=0;i<k;++i) { int b,c; cin>>b>>c; a[b].push_back(c); } int sum=0; memset(match,-1,sizeof(match)); for(int i=1;i<=n;++i) { memset(flag,false,sizeof(flag)); if(dfs(i)) sum++; } cout<<sum<<endl; }return 0; }