标签:
Time Limit: 5000MS | Memory Limit: 10000K | |
Total Submissions: 12192 | Accepted: 5454 |
Description
Input
Output
Sample Input
7 0: (3) 4 5 6 1: (2) 4 6 2: (0) 3: (0) 4: (2) 0 1 5: (1) 0 6: (2) 0 1 3 0: (2) 1 2 1: (1) 0 2: (1) 0
Sample Output
5 2
【分析】给出一些有关系的男女们,问最多有多少人之间没有关系。那就是求最大独立点集了,最大独立点集==顶点总数-匹配数。
由于此题我是两两匹配了两次,所以除以二。
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <string> #include <map> #include <queue> #include <vector> #define inf 0x7fffffff #define met(a,b) memset(a,b,sizeof a) typedef long long ll; using namespace std; const int N = 1005; const int M = 25005; int read() { int x=0,f=1; char c=getchar(); while(c<‘0‘||c>‘9‘) { if(c==‘-‘)f=-1; c=getchar(); } while(c>=‘0‘&&c<=‘9‘) { x=x*10+c-‘0‘; c=getchar(); } return x*f; } int n,k,cnt; int mp[N][N],vis[N],link[N]; int head[N],x[N],y[N]; struct man { int to,next; }edg[M]; void init() { met(head,-1);met(x,0);met(edg,0);met(y,0);cnt=0; } void add(int u,int v) { edg[cnt].to=v;edg[cnt].next=head[u];head[u]=cnt++; } bool dfs(int u) { for(int i=head[u];i!=-1;i=edg[i].next) { int v=edg[i].to; if(!vis[v]) { vis[v]=1; if(!y[v]||dfs(y[v])) { x[u]=v; y[v]=u; return true; } } } return false; } void MaxMatch() { int ans=0; for(int i=0; i<n; i++) { if(!x[i]) { met(vis,0); if(dfs(i))ans++; } } //printf("ans=%d\n",ans); printf("%d\n",n-ans/2); } int main() { while(~scanf("%d\n",&n)){ init(); int u,nn,v; for(int i=0;i<n;i++){ scanf("%d: (%d)",&u,&nn); for(int j=0;j<nn;j++){ scanf("%d",&v); add(i,v); } } MaxMatch(); } return 0; }
标签:
原文地址:http://www.cnblogs.com/jianrenfang/p/5935024.html