您的位置:首页 > 其它

hdu5285 二分图的判定

2015-07-23 16:27 411 查看
题意:有一群人,已知某两人之间互相不认识,要把这群人分成两部分,每部分至少一人,且在每部分内没有人互不认识。

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
const int N=100005;
int T,n,m;
vector<int> V
;
int col
;
int b[2],f,r;
int q
;
int main()
{
#ifndef  ONLINE_JUDGE
freopen("aaa","r",stdin);
#endif
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=0;i<N;i++) V[i].clear();
memset(col,-1,sizeof col);
if(n<2) {
puts("Poor wyh");
continue;
}
if(m==0){ //两两相互认识
printf("%d %d\n",n-1,1);
continue;
}
int u,v;
for(int i=0;i<m;i++) {
scanf("%d%d",&u,&v); //加入边
V[u].push_back(v);
V[v].push_back(u);
}
int big=0,small=0;
bool ok=true;
for(int i=1;i<=n && ok;i++) if(col[i]==-1){
f=r=b[0]=0;
col[i]=b[1]=1;//b[0] b[1] 记录两种颜色的数量
q[r++]=i; //广度搜索
while(f<r &&ok){
int now=q[f++];
for(int i=0;i<V[now].size() && ok;i++){
int tmp=V[now][i];
if(col[tmp]==-1) {
col[tmp]=col[now]^1;
q[r++]=tmp;
b[col[tmp]]++;
}
else{
if(col[tmp]==col[now]) ok=false;//出现矛盾
}
}
}
big+=max(b[0],b[1]);  //较多的颜色数量
small+=min(b[0],b[1]);
}
if(ok) printf("%d %d\n",big,small);
else puts("Poor wyh");

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: