bestcoder48 第二题
2015-07-20 15:36
363 查看
//把两个不认识的人互相连边,在判断下有没有环,就OK 了;
#include <iostream> #include<stdio.h> #include<string.h> #include<string> #include<vector> using namespace std; const int maxn=100000+10; vector<int>map1[maxn]; int n; int visit[maxn]; int sum[2]; void init() { for(int i=1;i<=n;i++) { map1[i].clear(); } } int flag; void dfs(int x,int k) { visit[x]=k; sum[k]+=1; for(int i=0;i<map1[x].size();i++) { int k1=map1[x][i]; if(visit[k1]==-1) dfs(map1[x][i],k^1); else { if((k^1)!=(visit[k1])) { flag=1; return ; } } } } void solve() { int team0=0; int team1=0; int rare=0; flag=0; for(int i=1;i<=n;i++) { if(visit[i]!=-1) continue; if(map1[i].size()==0) { rare+=1; continue; } memset(sum,0,sizeof(sum)); dfs(i,1); if(flag==1) break; if(sum[0]<sum[1]) swap(sum[0],sum[1]); team0+=sum[0]; team1+=sum[1]; } if(flag==1) printf("Poor wyh\n"); else { team0+=rare; if(team0==n) { team0-=1; team1=1; } printf("%d %d\n",team0,team1); } } int main() { int t; scanf("%d",&t); while(t--) { int m; memset(visit,-1,sizeof(visit)); scanf("%d%d",&n,&m); init(); int flag=0; for(int i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); map1[a].push_back(b); map1[b].push_back(a); } if(n==0||n==1) { printf("Poor wyh\n"); continue; } solve(); } return 0; }
相关文章推荐
- 2894 Txx考试
- POJ2964日历问题
- Multithreaded simple data type access and atomic variables
- 【C++】利用Visual Studio 2008编写C++,Visual Studio 2008的基本使用
- 清除Windows Server Backup 备份副本
- GRE写作必备句型
- jstring 和string char*之间的转换
- 你的程序支持复杂的时间调度嘛?
- 给还在上学的你们
- 真正有用的 返回键 重写 退出软键盘 或回到主界面
- 随笔
- 关于web api 中 日期格式问题解决方案
- 网络IO之阻塞、非阻塞、同步、异步总结
- JNIEnv解析
- jquery选择器汇总
- 【SpringMVC框架】非注解的处理器映射器和适配器
- SpringMVC注解...@controller和@RequestMapping
- HDU 2018 母牛的故事
- oracle sql 修改timestamp数据
- JavaScript学习要点(四)