HDU 4751 二分图判断

来源:互联网 发布:java 统计学函数 编辑:程序博客网 时间:2024/06/16 06:47

点击打开链接

题意:将n个人分到两个集合中,要求每个集合中的人都相互认识

思路:就是判断是不是二分图,对于一个人来说,如果另一个人和我不是相互认识的,那么他肯定是另一个集合中的人,按照这个分配出现矛盾则不能分配成功

#include <queue>#include <vector>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const int inf=0x3f3f3f3f;const int maxn=110;int num[maxn][maxn],cnt[maxn];bool judge(int n,int x){    queue<int>que;    que.push(x);    while(!que.empty()){        int c=que.front();que.pop();        for(int i=1;i<=n;i++){            if(i==c||(num[i][c]&&num[c][i])) continue;//如果是相互认识的可以在任意一方            else if(cnt[i]==0){//不认识的就要去另一阵营                if(cnt[c]==1) cnt[i]=2;                if(cnt[c]==2) cnt[i]=1;                que.push(i);            }else if(cnt[i]==cnt[c]) return 0;//不认识还在同一阵营,就不能成功        }    }    return 1;}int main(){    int n,a,b;    while(scanf("%d",&n)!=-1){        memset(num,0,sizeof(num));        memset(cnt,0,sizeof(cnt));        for(int i=1;i<=n;i++){            while(1){                scanf("%d",&a);                if(a==0) break;                num[i][a]=1;            }        }        int flag=0;        for(int i=1;i<=n;i++){            if(cnt[i]==0){                cnt[i]=1;//如果cnt[i]为0,说明我和之前所有人都认识,所以我现在去哪个阵营都可以,因为我都相互认识                if(judge(n,i)==0) flag=1;            }        }        if(flag) printf("NO\n");        else printf("YES\n");    }    return 0;}

0 0
原创粉丝点击