HDU5285.wyh2000 and pupil
2015-07-27 17:02
351 查看
如果a不认识b,那么在a,b间连一条边,这样有解当且仅当这张图是二分图。由于可能有多个二分图,而题目要求第一组的人尽可能多,所以贪心的选择即可。要注意m=0和n<=1的情况。
[code]#include <map> #include <set> #include <stack> #include <queue> #include <cmath> #include <ctime> #include <vector> #include <cstdio> #include <cctype> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #define INF 0x3f3f3f3f #define inf -0x3f3f3f3f #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define mem0(a) memset(a,0,sizeof(a)) #define mem1(a) memset(a,-1,sizeof(a)) #define mem(a, b) memset(a, b, sizeof(a)) typedef long long ll; const int maxn=101000; vector<int>G[maxn]; int vis[maxn]; int col[maxn]; int a,b,ok; void dfs(int u,int c){ if(c==0) a++; else b++; col[u]=c; vis[u]=1; int len=G[u].size(); for(int i=0;i<len;i++){ int v=G[u][i]; if(vis[v]==1){ if(col[v]==c) ok=1; continue; } dfs(v,c^1); } } int main(){ int n,m; int t; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) //预处理 G[i].clear(); mem0(vis); mem1(col); int x,y; if(n<=1){ //每组至少有一个人 printf("Poor wyh\n"); continue; } for(int i=0;i<m;i++){ scanf("%d%d",&x,&y); G[x].push_back(y); G[y].push_back(x); } ok=0; int ans1=0,ans2=0; for(int i=1;i<=n;i++){ a=0,b=0; if(ok==1) break; if(vis[i]==1) continue; dfs(i,0); if(a<b) swap(a,b); ans1+=a; ans2+=b; //printf("%d PPPPPPP %d\n",ans1,ans2); } if(ok==1){ printf("Poor wyh\n"); } else{ if(ans2==0) printf("%d %d\n",ans1-1,1); else printf("%d %d\n",ans1,ans2); } } return 0; }
相关文章推荐
- android的“播放引擎stagefright”中“OMX文件解码”
- 原地随机排列数组
- AngularJS学习笔记
- maya制作玻璃材质
- 聚类之详解FCM算法原理及应用
- hdu 2546 饭卡(01背包)
- Duanxx的STM32学习:NVIC操作
- grunt压缩多个js文件和css文件
- 开发部署前端代码
- AndroidManifest.xml - 【 manifest -> permission】
- scrollLeft的必要条件
- HDU 4920 Matrix multiplication
- mysql提示 Lock wait timeout exceeded解决办法
- MFC 中_MAX_PATH的理解
- 2015暑假集训第一周题目总结
- IOS开发单元格自定义方法之一
- java基础入门-建立可以多客户端链接的ServerSocket
- A + B Problem II(大数加法)
- snnu(1110) 传输网络 (并查集+路径压缩+离线操作 || 线段树)
- 根据微信号来抓取微信文章