题目大意:求二分图最小点覆盖和最大独立集。
题目分析:如果选中一个点,那么与这个点相连的所有边都被覆盖,使所有边都被覆盖的最小点集称为最小点覆盖,它等于最大匹配;任意两个点之间都没有边相连的最大点集称为最大独立集,它等于总节点数减去最大匹配数。
代码如下:
# include<iostream> # include<cstdio> # include<cmath> # include<vector> # include<list> # include<queue> # include<map> # include<set> # include<cstring> # include<algorithm> using namespace std; const int N=1000; const int INF=1000000000; const double inf=1e20; int n,m; int link[N+5]; vector<int>e[N+5]; int mark[N+5]; bool match(int x) { for(int i=0;i<e[x].size();++i){ int y=e[x][i]; if(mark[y]) continue; mark[y]=1; if(link[y]==-1||match(link[y])){ link[y]=x; return true; } } return false; } int main() { while(~scanf("%d%d",&n,&m)) { for(int i=0;i<n;++i) e[i].clear(); int a,b; while(m--) { scanf("%d%d",&a,&b); --a,--b; e[a].push_back(b); e[b].push_back(a); } int cnt=0; memset(link,-1,sizeof(link)); for(int i=0;i<n;++i){ memset(mark,0,sizeof(mark)); if(match(i)) ++cnt; } cnt/=2; printf("%d %d ",cnt,n-cnt); } return 0; }