题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2444
就会给你n个人,m个朋友关系,然后让你判断是否能把他们分成两组
然后里面谁也不认识对方
如果能,输出最大的组的人数
然后里面谁也不认识对方
如果能,输出最大的组的人数
解法,先判断二分图,然后在二分图匹配
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; struct node { int v,u; int next; }V[1000*1000]; int n,m; int tol; int head[1000]; int col[1000]; int link[1000]; bool vis[1000]; void init() { int tol=0; memset(head,-1,sizeof(head)); } void add(int u,int v) { V[tol].v=v; V[tol].u=u; V[tol].next=head[u]; head[u]=tol++; int t=u;u=v;v=t; V[tol].v=v; V[tol].u=u; V[tol].next=head[u]; head[u]=tol++; } bool dfs(int u) { vis[u]=1; for(int k=head[u];k!=-1;k=V[k].next) { int v=V[k].v; if(!vis[v]) { vis[v]=1; if(link[v]==-1||dfs(link[v])) { link[v]=u; return true; } } } return false; } int match() { int ans=0; memset(link,-1,sizeof(link)); for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) ans++; } return ans; } bool bldfs(int u,int co) { int i,v; col[u]=co; for(i=head[u];i!=-1;i=V[i].next) { v=V[i].v; if(col[v]==co) return false; if(col[v]==-1&&!bldfs(v,co^1)) return false; } return true; } int main() { while(scanf("%d %d",&n,&m)!=EOF) { init(); int u,v; for(int i=0;i<m;i++) { scanf("%d %d",&u,&v); add(u,v); add(v,u); } memset(col,-1,sizeof(col)); int flag=0; for(int i=1;i<=n;i++) { if(col[i]==-1) if(!bldfs(i,1)) { flag=1; break; } } if(flag==1) printf("No "); else { int ans=match(); printf("%d ",ans/2); } } return 0; }