题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=237
二分匹配--最小点覆盖模板题
Tips:用邻接矩阵超时,用数组模拟邻接表WA,暂时只有vector<>过了!
代码如下:
//最小点覆盖 = 最大匹配数 //最大独立集 = N - 最大匹配数 #include "stdio.h" //二分匹配,求最小点覆盖 #include "string.h" #include "vector" using namespace std; #define N 505 int match[N]; bool mark[N]; vector<int> s[N]; bool find(int x,int n) { for(int i=0; i<(int)s[x].size(); i++) { int y = s[x][i]; if(!mark[y]) { mark[y] = true; if(match[y]==0 || find(match[y],n)) { match[y] = x; return true; } } } return false; } int main() { int T; int x,y; int i,n,k; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&k); for(i=0; i<N; ++i) s[i].clear(); while(k--) { scanf("%d %d",&x,&y); s[x].push_back(y); } int ans = 0; memset(match,0,sizeof(match)); for(i=1; i<=n; ++i) { memset(mark,false,sizeof(mark)); if(find(i,n)) ans++; } printf("%d ",ans); } return 0; }