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; }
相关文章推荐
- N皇后问题(HDU 2553)
- ViewPager 详解(五)-----使用Fragment实现ViewPager滑动
- 【IAP支付之二】In app purchase 本地购买和服务器购买两种购买模式
- Unity3D动画贴图、滚动纹理、滚动贴图脚本
- 激活2003终端服务
- Coursera台大机器学习技法课程笔记05-Kernel Logistic Regression
- Java的Package与Import机制--心得
- DataTables-table的布局sDom
- 认知诊断模型
- 函数栈详解以及堆区与栈区的区别
- Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应
- Android Studio运行安卓程序报Failure [INSTALL_FAILED_OLDER_SDK]的解决办法
- 分割线的写法
- Android UI
- Android studio之启动AVD模拟器异常
- Laravel 在windows安装
- Java编程经验之谈(1)
- 登陆模块 测试用例
- easyui获取当前点击对象tabs的title
- MYSQL 实现 MSSQL row_number() 类似的分组排序