有一个集合男和一个集合女,给出两集合间一些一一相应关系。问该两集合中的最大独立集的点数。
最大独立集=顶点总数-最大匹配数
此题中。若(a,b)有关。则(b,a)有关。每个关系算了两次,相当于二分图的两边集合没有分男女。两边都是总人数。
所以此题中答案应该是 顶点总数-最大匹配数/2
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<queue> const int maxn=510; using namespace std; int mx[maxn],my[maxn],vis[maxn],e[maxn][maxn],n; int path(int i) { int j; for(j=0;j<n;j++) { if(e[i][j]&&!vis[j]) { vis[j]=1; if(my[j]==-1||path(my[j])) { my[j]=i; mx[i]=j; return 1; } } } return 0; } int hungry() { int res=0; memset(mx,-1,sizeof mx); memset(my,-1,sizeof my); for(int i=0;i<n;i++) { if(mx[i]==-1) { memset(vis,0,sizeof vis); res+=path(i); } } return res; } int main() { int a,b,m,i; while(~scanf("%d",&n)) { memset(e,0,sizeof e); for(i=0;i<n;i++) { scanf("%d: (%d)",&a,&m); while(m--) { scanf("%d",&b); e[a][b]=1; } } printf("%d ",n-hungry()/2); } return 0; }