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 场 ...
随机推荐
- Delphi Android USB声明文件
自己转的比较全面的USB声明文件: unit Androidapi.JNI.USB; interface uses AndroidAPI.JNIBridge, Androidapi.JNI.JavaT ...
- Hadoop生态新增列式存储系统Kudu
Hadoop生态系统发展到现在,存储层主要由HDFS和HBase两个系统把持着,一直没有太大突破.在追求高吞吐的批处理场景下,我们选用HDFS,在追求低延迟,有随机读写需求的场景下,我们选用H ...
- Linux C 语言之 Hello World 详解
目录 Linux C 语言之 Hello World 详解 第一个 C 语言程序 程序运行原理 编译,链接 运行时 链接库 编译器优化 Hello World 打印原理 stdout, stdin 和 ...
- python教程(零)·前言
本教程是作者根据自己学习python的经验写下的,一来是想将经验分享给对python同样感兴趣的小白(大神请忽略),二来是想借此加深本人对python的理解,温故而知新. 学习基础 本教程面向的读者, ...
- NoSQL入门第一天——NoSQL入门与基本概述
一.课程大纲 二.入门概述 1.为什么用NoSQL 单机MySQL的年代: 一个网站的访问量一般都不大,用单个数据库完全可以轻松应付. 我们来看看数据存储的瓶颈是什么? 1.数据量的总大小 一个机器放 ...
- 20155215 2016-2017-2《Java程序设计》课程总结
20155215 2016-2017-2<Java程序设计>课程总结 一.(按顺序)每周作业链接汇总 预备作业1: 对于JAVA课程本身的期望和理解.以及期望的师生关系是什么样的,自己印象 ...
- 2017-2018-1 20155330《信息安全技术》实验二——Windows口令破解
2017-2018-1 20155330<信息安全技术>实验二--Windows口令破解 姓名:朱玥 学号:20155330 班级:201553 日期:2017.10.24 实验环境 系统 ...
- MySQL入门篇(一)之MySQL部署
MySQL 二进制免编译安装 (1)下载二进制免编译版本mysql 5.6.35 [root@localhost tools]# wget http://mirrors.sohu.com/mysql/ ...
- 提取oracle awr报告
做性能测试时有时需要分析sql的执行情况,以找出需要优化的sql,oracle数据库就提供了很好的数据库状态和sql执行情况的监控平台,数据库的监控平台可以时时的监控数据库的状态,同时还可以取监控的时 ...
- Linux TCP/IP调优参数 /proc/sys/net/目录
所有的TCP/IP调优参数都位于/proc/sys/net/目录. 例如, 下面是最重要的一些调优参数,后面是它们的含义: /proc/sys/net/core/rmem_default " ...