Relation(NOIP模拟赛)(二分图染色)
原题:
Description
有n个人,编号为1àn,告诉你那些人之间是不友好的。现在,让你将这n个人分成两组,使得每一组之内的人是互相友好的,如果可以分成两组,则输出如何分组的,如果不可以分成两组,那么,输出“IMPOSSIBLE”。
Input
第一行两个整数n和m,1<=n<=50000,0<=m<=500000,分别表示人数以及不友好的人的对数。以下m行每行两个数a,b,表示a与b是不友好的。
Output
如果可以分成两个组,则输出一个方案,第一行为第一组的人的编号,第二行为第二组人的,按升序输出。其中,方案的字典序必须要最小,所谓的方案字典序最小,就是第一行和第二行连接,组成的序列的字典序最小,如果有多种分配方法,取第一个组别人数最多的方案。如果不能分成两组,输出“IMPOSSIBLE”。
Sample Input(relation.in)
5 4
1 4
1 5
2 4
2 5
Sample Output(relation.out)
1 2 3
4 5
样例解释:
有两种方案,1 2 3 和 1 2
4 5 3 4 5
两种方案的字典序相同,取第一组人数最多的方案,所以输出方案一。
题目满足:
40%的数据n<=1000
100%的数据n<=50000,m<=500000
时限 1s
这道题典型的二分图染色(因为分成2组)
当然,根据题目,我们最后要SORT一下输出
并且,方案字典序相同时,取第一组人数最多的方案
所以染色的时候尽量多分配1,不行再回溯修改
下面贴代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct edge{
int to,next;
}g[];
int color[];
int head[],n,m;
bool visit[];
int ans1[],ans2[],num=,num1=,num2=;
void ins(int x,int y){g[++num].next=head[x];head[x]=num;g[num].to=y;}
void insw(int x,int y){ins(x,y);ins(y,x);}
bool dfs(int x){
visit[x]=true;
for(int i=head[x];i;i=g[i].next)
{
if(!visit[g[i].to])
{
color[g[i].to]=color[x]==?:;
visit[g[i].to]=true;
if(!dfs(g[i].to))color[x]=color[x]==?:;
}
else if(color[g[i].to]!=-&&color[g[i].to]==color[x]){color[x]=color[x]==?:;return false;}
}
return true;
}
int main(){
freopen("relation.in","r",stdin);
freopen("relation.out","w",stdout);
memset(color,-,sizeof(color));
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
insw(x,y);
}
bool shuchu=false;
for(int i=;i<=n;i++)
{
if(color[i]==-){color[i]=;if(!dfs(i)){printf("IMPOSSIBLE\n");shuchu=true;break;}}
}
if(!shuchu){
for(int i=;i<=n;i++)
if(color[i]||color[i]==-)ans1[++num1]=i; else ans2[++num2]=i;
sort(ans1+,ans1+num1+);
sort(ans2+,ans2+num2+);
for(int i=;i<num1;i++)
printf("%d ",ans1[i]);
printf("%d\n",ans1[num1]);
for(int i=;i<num2;i++)
printf("%d ",ans2[i]);
printf("%d\n",ans2[num2]);
}
fclose(stdin);
fclose(stdout);
}
Relation(NOIP模拟赛)(二分图染色)的更多相关文章
- NOI.AC NOIP模拟赛 第三场 补记
NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
随机推荐
- python 函数的嵌套 和 作用域链
# def max(a,b): # return a if a>b else b # # def the_max(x,y,z): #函数的嵌套调用 # c = max(x,y) # return ...
- 虚拟机linux桥接联网问题
Linux系统为redhat5.8 虚拟机的版本:vm8.0 本人刚刚开始接触linux,今日需要通过linux进行联网,因此也学习了一点点关于虚拟机的联网的知识,在此与大家进行分享,希望大家可以之处 ...
- 找回被丢弃怎么找都找不回来的git中的commit
崩溃的一天,打算提代码走人,结果切分支之后,commit丢了= =,找了三个多小时 接下来分享下如何找回丢失的commit的 打开项目所在位置,打开git bash,在gitBASH中输入 git f ...
- ImageButton的坑 ImageButton 有问题
最近在用ImageButton,发现,我如果new ImageButton,并且 设置Warp_content,但是它并不会正真的warp,它会有一个边框. 不知道怎么回事. 后来,在代码里面使用Im ...
- 启动zookeeper报错:JAVA_HOME is not set
启动zookeeper时报错JAVA_HOME is not set 看了环境变量,确实配置好了,但是zookeeper竟然没找到 修改bin目录下的zkEnv.cmd关于jdk的一部分 set JA ...
- 新生 & 语不惊人死不休 —— 《无限恐怖》读后有感
开篇声明,我博客中“小心情”这一系列,全都是日记啊随笔啊什么乱七八糟的.如果一不小心点进来了,不妨直接关掉.我自己曾经写过一段时间的日记,常常翻看,毫无疑问我的文笔是很差的,而且心情也是瞬息万变的.因 ...
- 21、AngularJs知识点总结 part-3
1.选择框select 在 AngularJS 中我们可以使用 ng-option 指令来创建一个下拉列表,列表项通过对象和数组循环输出,也可以使用ng-repeat 指令来创建下拉列表: 区别:ng ...
- 转载——一步步学习js
一步步学习javascript基础篇(0):开篇索引 阅读目录 索引: 一步步学习javascript基础篇(1):基本概念 一步步学习javascript基础篇(2):作用域和作用域链 一步步学习j ...
- Python学习2,小程序
今天主要就是弄懂了一个循环判 for i in [1,2]: for j in [1, 2, 3]: print(i, j) break else: print("for-j") ...
- diskimage-builder element
root阶段 创建或修改初始根文件系统内容. 这是添加替代分销支持的地方,还是建立在现有图像上的自定义. 只有一个元素可以一次使用它,除非特别注意不要盲目覆盖,而是适应其他元素提取的上下文. -cac ...