BZOJ 1248--游乐园(DFS&贪心)
1248: 游乐园Pleasure Ground
Time Limit: 10 Sec Memory Limit: 128 MBSec Special Judge
Submit: 6 Solved: 2
[Submit][Status][Discuss]
Description
HarryPotter是一家游乐场的新负责人。刚上任时HarryPotter发现游客们频频抱怨 游乐场的道路非常拥挤。经过研究,HarryPotter打算把游乐场中所有道路改为单行道, 就是说游客只能从道路的一端走到另一端,而反过来不行。但是新的问题出现了:如何 保证游客能从公园的任意一个的地方走到任意其他地方。由于游乐场的道路错综复杂, HarryPotter花了很长时间也没找到道路更改的方案。 整个游乐场可以看作是由n个区域和m个连接两区域的道路组成的。任意两个不同的 区域间至多有一条道路。请你帮助HarryPotter将所有道路设为单向,并且使游客能从 任意区域到达任何他想去的区域。
Input
第一行有2个整数n,m。n为游乐场被的区域数,m为道路数。 以下有m行,每行有两个整数i,j。表示区域i与区域j之间有一条道路。 规模:0
Output
如果没有可行方案就输出"impossible",否则: 输出m行,每行有两个整数i,j,表示区域i与区域j之间的道路方向为从i到j。 注意:输出数据描述的道路必须与输入数据吻合。也就是说对于输入数据中的每一 组i,j,一定能在输出数据件中找到i,j或j,i。
Sample Input
3 3
1 2
1 3
2 3
输入样例2
4 3
1 2
2 3
3 4
Sample Output
1 2
2 3
3 1
输出样例2
impossible
题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=1248
Solution
如果要每个点都能到达其他所有点,那么对于第1个点就要能到达所有点。。。
然后每个点都要能到达第1个点。。。。
于是第一次DFS,把每条可以连到新点的线方向确定下来。。
因为对于有向图来说,每个点都在环上才能满足题意。。所以第一次深搜宽度越小越好。。
去掉所有边,把方向确定的边连反向边,其他边重连双向边。。
再做一次DFS。。。把每条必需确定方向的边确定掉。。
两次DFS如果又一次到不了某个点,就是无解。。。
其他未确定方向的边就随便啦。。。。
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define N 200000
#define LL long long
using namespace std;
inline int Read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,m,cnt=0;
int hed[N],vis[N];
struct LINE{
int l,r,c;
}L[1000000];
struct edge{
int r,num,nxt;
}e[2000000];
void insert(int u,int v,int num){
e[++cnt].r=v;e[cnt].num=num;e[cnt].nxt=hed[u];hed[u]=cnt;
}
void dfs1(int x){
vis[x]=1;
for(int i=hed[x];i;i=e[i].nxt)
if(vis[e[i].r]==0){
if(e[i].r==L[e[i].num].r) L[e[i].num].c=1;
else L[e[i].num].c=2;
dfs1(e[i].r);
}
}
void dfs2(int x){
vis[x]=1;
for(int i=hed[x];i;i=e[i].nxt)
if(vis[e[i].r]==0){
if(e[i].r==L[e[i].num].l) L[e[i].num].c=1;
else L[e[i].num].c=2;
dfs2(e[i].r);
}
}
int main(){
n=Read();m=Read();cnt=0;
for(int i=1;i<=m;i++){
L[i].l=Read();L[i].r=Read();L[i].c=0;
insert(L[i].l,L[i].r,i);
insert(L[i].r,L[i].l,i);
}
dfs1(1);
for(int i=1;i<=n;i++){
if(vis[i]==0){
printf("impossible\n");
return 0;
}
vis[i]=0;hed[i]=0;
}
cnt=0;
for(int i=1;i<=m;i++){
if(L[i].c==0){
insert(L[i].l,L[i].r,i);
insert(L[i].r,L[i].l,i);
}
if(L[i].c==1)
insert(L[i].r,L[i].l,i);
if(L[i].c==2)
insert(L[i].l,L[i].r,i);
}
dfs2(1);
for(int i=1;i<=n;i++)
if(vis[i]==0){
printf("impossible\n");
return 0;
}
for(int i=1;i<=m;i++){
if(L[i].c==2) printf("%d %d\n",L[i].r,L[i].l);
else printf("%d %d\n",L[i].l,L[i].r);
}
return 0;
}
This passage is made by Iscream-2001.
BZOJ 1248--游乐园(DFS&贪心)的更多相关文章
- 【bzoj4813】[Cqoi2017]小Q的棋盘 树上dfs+贪心
题目描述 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上共有V个格点,编号为0,1,2…,V-1,它们是连通的 ...
- ICPC Asia Nanning 2017 I. Rake It In (DFS+贪心 或 对抗搜索+Alpha-Beta剪枝)
题目链接:Rake It In 比赛链接:ICPC Asia Nanning 2017 Description The designers have come up with a new simple ...
- 【NOIP2015】斗地主 题解(DFS+贪心)
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的AAA到KKK加上大小王的共545454张牌来进行的扑克牌游戏.在斗地主中,牌的大小关 系根据牌的数码表示如下: ...
- NOIP2015斗地主[DFS 贪心]
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- NOIP2010引水入城[BFS DFS 贪心]
题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...
- BZOJ 1029 建筑抢修 贪心+堆
又搞了一晚上OI,编了两道BZOJ和几道NOI题库,临走之前写两篇感想 noip越来越近了,韩大和clove爷已经开始停课虐我们了... 1029: [JSOI2007]建筑抢修 Time Limit ...
- [bzoj 2151]种树(贪心)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2151 分析:原型是bzoj 1150(CTSC 2007) 首先DP无法下手,想到贪心.想到贪 ...
- Aizu 2302 On or Off dfs/贪心
On or Off Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.act ...
- BZOJ.5397.circular(随机化 贪心)
BZOJ 感觉自己完全没做过环上选线段的问题(除了一个2-SAT),所以来具体写一写qwq. 基本完全抄自remoon的题解qwq... (下标从\(0\sim m-1\)) 拆环为链,对于原线段\( ...
随机推荐
- asp.net 初级程序员面试题【待续】
C# 常见的排序方式 冒泡排序(Bubble sort) 堆排序(Heap sort) 插入排序(Insertion sort) 归并排序(Merge sort) 快速排序(Quick sort) ...
- 8.3.2018 1 Quick and dirty 快而脏的快餐
Quick and dirty 快而脏的快餐 BEIJING 北京 Food delivery is a booming business. Waste is piling up, too 送餐 ...
- Python slice() 函数
Python slice() 函数 Python 内置函数 描述 slice() 函数实现切片对象,主要用在切片操作函数里的参数传递. 语法 slice 语法: class slice(stop) ...
- Educational Codeforces Round 54
这套题不难,但是场上数据水,导致有很多叉点 A. 因为是让求删掉一个后字典序最小,那么当a[i]>a[i+1]的时候,删掉a[i]一定最优!这个题有个叉点,当扫完一遍如果没有满足条件的,就删去最 ...
- Java项目的结构
-------siwuxie095 以 Hello World 为例 这个工程用一个文件夹表示,被放置在左侧的资源管理面板 Package Explorer 中 ...
- springboot 配置jsp支持
springboot默认并不支持jsp模板,所以需要配置. 下面是一个可以运行的例子: 首先配置属性文件: spring.http.encoding.force=true spring.http. ...
- 阿里云Object Storage Service(OSS)
最近在做一个文件上传.下载的东西,由于上传下载操作频繁.文件存储到独立的服务器, 后来发现阿里云有一项文件存储服务,介绍说很好用,于是就开始使用了. https://help.aliyun.com/d ...
- Photoshop中的高斯模糊、高反差保留和Halcon中的rft频域分析研究
在Halcon的rft变换中,我们经常可以看到这样的算子组合: rft_generic (Image, ImageFFT2, 'to_freq', 'none', 'complex', Width) ...
- C语言日志处理
一.简介 zlog是一个高可靠性.高性能.线程安全.灵活.概念清晰的纯C日志函数库,在效率.功能.安全性上大大超过了log4c,并且是用c写成的,具有比较好的通用性. 二.安装 下载 https:// ...
- Android Studio真机测试
本页内容 1.真机测试好处多 2.开始吧!真机测试 1.真机测试好处多 不久前才开我的Android Studio之旅,就遇上了一个大麻烦——创建的模拟器各种运行出错.尝试了各种解决方法,都没有什么结 ...