HDU 5285 wyh2000 and pupil 判二分图+贪心
题目链接:
hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5285
bc:http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=609&pid=1002
wyh2000 and pupil
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 1304 Accepted Submission(s): 418
Wyh2000 has n pupils.Id of them are from 1 to n.In order to increase the cohesion between pupils,wyh2000 decide to divide them into 2 groups.Each group has at least 1 pupil.
Now that some pupils don't know each other(if a doesn't know b,then b doesn't know a).Wyh2000 hopes that if two pupils are in the same group,then they know each other,and the pupils of the first group must be as much as possible.
Please help wyh2000 determine the pupils of first group and second group. If there is no solution, print "Poor wyh".
For each case, the first line contains two integers n,m indicate the number of pupil and the number of pupils don't konw each other.
In the next m lines,each line contains 2 intergers x,y(x<y),indicates that x don't know y and y don't know x,the pair (x,y) will only appear once.
T≤10,0≤n,m≤100000
8 5
3 4
5 6
1 2
5 8
3 5
5 4
2 3
4 5
3 4
2 4
题解:
有解条件:每个连通分量都为二分图,且能够分为人数都大于1的两组。
先用黑白染色法来判断每个连通分量是否都为二分图,之后对每个联通分量,分成黑白两组后人数多的进第一组,人数少的进第二组。
这样贪心会有一个问题,第二个组的人数少于1,所以还要做一些调整。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int maxn = ;
const int INF = 0x3f3f3f3f; struct Edge {
int v, ne;
Edge(int v = , int ne = ) :v(v), ne(ne) {};
}egs[maxn * ]; int n, m;
int head[maxn], tot;
//vis[i]==-1:没访问过,==0:白色,==1:黑色
int vis[maxn]; void addEdge(int u, int v) {
egs[tot] = Edge(v, head[u]);
head[u] = tot++;
} int vis2[maxn];
//统计该连通分量黑白两色的人数
void dfs2(int cur, int &cnt0, int &cnt1) {
vis2[cur] = ;
if (vis[cur] == ) cnt0++;
else cnt1++;
int p = head[cur];
while (p != -) {
Edge &e = egs[p];
if (!vis2[e.v]) {
dfs2(e.v, cnt0, cnt1);
}
p = e.ne;
}
}
//二染色判二分图
bool dfs(int cur) {
int p = head[cur];
while (p != -) {
Edge &e = egs[p];
if (vis[e.v] == -) {
vis[e.v] = vis[cur] ^ ;
dfs(e.v);
}
else if (vis[e.v] == vis[cur]) {
return false;
}
p = e.ne;
}
return true;
} void init() {
tot = ;
memset(head, -, sizeof(head));
memset(vis, -, sizeof(vis));
memset(vis2, , sizeof(vis2));
} int main() {
int tc;
scanf("%d", &tc);
while (tc--) {
init();
scanf("%d%d", &n, &m);
for (int i = ; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
u--, v--;
addEdge(u, v);
addEdge(v, u);
}
int ans = ;
int flag = , adj = INF;
for (int i = ; i < n; i++) {
if (vis[i] == -) {
vis[i] = ;
if (!dfs(i)) {
flag = ; break;
}
else {
int cnt0 = , cnt1 = ;
dfs2(i, cnt0, cnt1);
ans += max(cnt0, cnt1);
if (abs(cnt0 - cnt1) > ) {
adj = min(adj, abs(cnt0 - cnt1));
}
}
}
}
//调整
if (adj == INF) adj = ;
if (n - ans < ) { ans -= adj; }
if (flag || n - ans< || ans<) {
printf("Poor wyh\n");
}
else {
printf("%d %d\n", max(ans, n - ans), min(ans, n - ans));
}
}
return ;
}
HDU 5285 wyh2000 and pupil 判二分图+贪心的更多相关文章
- Hdu 5285 wyh2000 and pupil (bfs染色判断奇环) (二分图匹配)
题目链接: BestCoder Round #48 ($) 1002 题目描述: n个小朋友要被分成两班,但是有些小朋友之间是不认得的,所以规定不能把不认识的小朋友分在一个班级里面,并且一班的人数要比 ...
- HDU 5285 wyh2000 and pupil(dfs或种类并查集)
wyh2000 and pupil Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Other ...
- HDU 5285 wyh2000 and pupil (二分图着色)
题意: 共有n个小学生,编号为1−n.将所有小学生分成2组,每组都至少有1个人.但是有些小学生之间并不认识,而且如果a不认识b,那么b也不认识a.Wyh2000希望每组中的小学生都互相认识.而且第一组 ...
- HDU 5285 wyh2000 and pupil
题意:有一群人,已知某两人之间互相不认识,要把这群人分成两部分,每部分至少一人,且在每部分内没有人互不认识. 解法:图染色.某场bestcoder第二题……看完题觉得是个二分图……完全不会二分图什么的 ...
- hdu 5285 wyh2000 and pupil(二染色)
第一次用vector解得题.值得纪念,这道题是二染色问题,我用bfs解得.就是染色,推断,计数问题,其 实挺简单的,就是得判一下特殊情况,当n<2的时候就不能有解,由于题目要求每一个组至少有一个 ...
- ACM: HDU 5285 wyh2000 and pupil-二分图判定
HDU 5285 wyh2000 and pupil Time Limit:1500MS Memory Limit:65536KB 64bit IO Format:%I64d &a ...
- HDU 5285:wyh2000 and pupil
wyh2000 and pupil Accepts: 93 Submissions: 925 Time Limit: 3000/1500 MS (Java/Others) Memory Lim ...
- 二分图判定+点染色/并查集 BestCoder Round #48 ($) 1002 wyh2000 and pupil
题目传送门 /* 二分图判定+点染色:因为有很多联通块,要对所有点二分图匹配,若不能,存在点是无法分配的,no 每一次二分图匹配时,将点多的集合加大最后第一个集合去 注意:n <= 1,no,两 ...
- hdu 5285 二分图黑白染色
题意:给出 n 个人,以及 m 对互不认识的关系,剩余的人都互相认识,要将所有人分成两组,组内不能有互不认识的人,要求每组至少有一人,并且第一组人数尽量多,问两组人数或不可能时单独输出 BC 48 场 ...
随机推荐
- iOS日历显示农历信息
第一次接触到日历的开发,表示需要学习的东西还有很多呢! 关于日历的开发,如果不进行相关设置的话,默认是没有农历的,需要我们进行设置. 核心Demo如下: monthArr = [NSArray arr ...
- Spring retry实践
在开发中,重试是一个经常使用的手段.比如MQ发送消息失败,会采取重试手段,比如工程中使用RPC请求外部服务,可能因为网络波动出现超时而采取重试手段......可以看见重试操作是非常常见的一种处理问题, ...
- 帝国CMS给会员注册加入问答验证
修改文件有e/enews/index.php //注册 elseif($enews=="register") { if($_POST['ask']=='帝国软件') { $user ...
- MQTT入门1 -- mosquitto 安装
原文链接:https://www.cnblogs.com/NickQ/p/9247638.html MQTT入门1 -- mosquitto 安装 简介: MQTT(Message Queuing T ...
- uva 210 - Concurrency Simulator (并行程序模拟)
from CSDN: https://blog.csdn.net/su_cicada/article/details/87898579 例题6-1 并行程序模拟( Concurrency Simula ...
- sourcetree的安装及使用
sourcetree下载地址:https://www.sourcetreeapp.com/ 点击安装包安装 此前需要跳转到bitbucket登录,我没有账号,所以我直接跳转到到https://bitb ...
- go 网络请求篇二
框架地址:https://github.com/parnurzeal/gorequest package main //https://antarx.com/2018/05/05/gorequest- ...
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--J-强迫症的序列
链接:https://www.nowcoder.com/acm/contest/90/J 来源:牛客网 1.题目描述 牛客网是IT求职神器,提供海量C++.JAVA.前端等职业笔试题库,在线进行百度阿 ...
- zabbix最新版3.4搭建(根据官方文档适当修改)
操作系统:CentOS Linux release 7.4.1708 (Core) 1.安装apache 1.1 安装apache yum install httpd httpd-devel 1.2 ...
- 【转载】从零实现3D图像引擎:(1)环境配置与项目框架
原文:从零实现3D图像引擎:(1)环境配置与项目框架 0. 要学懂3D程序设计,必然要精通3D相关的线性代数.3D几何.复分析等相关知识,我也因为如此才开始这个博客系列的写作,不自己实现,就不是自己的 ...