hdu5385 wyh2000 and pupil 二分图
2015-07-19 13:07
417 查看
B.wyh2000 and pupil
题意是将彼此不认识的人分两组,第一组尽可能人数最多,并且每组至少有一个人,如果不能分成两组则输出”Poor wyh”
这个是二分图,将人分成两组,首先构成图,如
G[1]={ 2 3 4 5},即1与2,3,4,5 不认识
1. 还未分组的先放到第group组,用dfs(i,group(1 or 2)),再枚举与i不认识的人
2.已分组的判断是否有冲突,还未分组则递归执行上一步骤,此时group=3-group
其实一开始觉得只要找到各个分组的人数就是了,后来发现并不是的
比如这一组:
2
6 4
1 2
1 3
2 4
4 5
正确应为:4 2
但如果只找各个组人数就是:3 3
模拟一下就知道了
题意是将彼此不认识的人分两组,第一组尽可能人数最多,并且每组至少有一个人,如果不能分成两组则输出”Poor wyh”
这个是二分图,将人分成两组,首先构成图,如
G[1]={ 2 3 4 5},即1与2,3,4,5 不认识
1. 还未分组的先放到第group组,用dfs(i,group(1 or 2)),再枚举与i不认识的人
2.已分组的判断是否有冲突,还未分组则递归执行上一步骤,此时group=3-group
#include <cstdio> #include <cstring> #include <vector> #include <iostream> using namespace std; const int N=100005; int f ; //标记分组 int cnt[3]; //计算每组人数 vector<int>G ; //记录 bool dfs(int u,int gr) //dfs找增广路 { f[u]=gr; //标记组 cnt[gr]++; for(int i=0;i<G[u].size();i++){ //枚举 int v=G[u][i]; if(f[v]!=-1){ //若已分组 if(f[v]!=(3-gr)) return false; } else if(!dfs(v,3-gr)) return false; //未分组 } return true; } void work(int n) { int ans=0; int s1=0; int s2=0; memset(cnt,0,sizeof cnt); memset(f,-1,sizeof f); for(int i=1;i<=n;i++){ int c1=cnt[1]; int c2=cnt[2]; if(f[i]<0){ //未分组 if(!dfs(i,1)){ puts("Poor wyh"); return; } //printf("c1=%d c2=%d cnt1=%d cnt2=%d\n",c1,c2,cnt[1],cnt[2]); s1+=max(cnt[1]-c1,cnt[2]-c2); //将每次增加人数最多的加到s1 s2+=min(cnt[1]-c1,cnt[2]-c2); // printf("s1=%d s2=%d\n",s1,s2); } } //ans=cnt[1]>cnt[2]?cnt[1]:cnt[2]; if(s2==0) s1--,s2++; printf("%d %d\n",s1,s2); } int main() { int T; scanf("%d",&T); while(T--) { int n,m; int x,y; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) G[i].clear(); for(int i=0;i<m;i++){ scanf("%d%d",&x,&y); G[x].push_back(y); G[y].push_back(x); } if(n<2){ puts("Poor wyh"); continue; } work(n); } return 0; }
其实一开始觉得只要找到各个分组的人数就是了,后来发现并不是的
比如这一组:
2
6 4
1 2
1 3
2 4
4 5
正确应为:4 2
但如果只找各个组人数就是:3 3
模拟一下就知道了
相关文章推荐
- linux安装mysql的方法
- php 点滴
- xrange和range区别
- uva :10123 - No Tipping(dfs + 几何力矩 )
- poj 3615Cow Hurdles floyd
- winrar去广告弹窗
- linux安装MySQL 5.6.10包冲突问题导致安装失败的问题
- [amanhardikar] - Wireless
- 几个简单的Java正则用例:
- 视频格式转码工具FFMPEG
- 数论之欧几里德算法(一)
- [Unity3D]Unity3D自动寻路Demo
- 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记36 TableViewDatasource
- XMLHttpRequest Level 2 使用指南——ajax实现http(s)协议的原理
- Android-它们的定义Notification
- NYOJ273 字母小游戏
- JAVA_SE基础——18.方法的递归
- Linux RPM 命令详解及源码编译安装
- hdu 1020 Encoding
- [Unity3D]Unity3D官方案例SpaceShooter开发教程