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\)) 拆环为链,对于原线段\( ...
随机推荐
- 7.25 10figting!
TEXT 88 European utilities欧洲公用事业 Power struggles 能源之争(陈继龙编译) Nov 30th 2006 From The Economist print ...
- consul service
{ "name": "consul-agent (host:{{ .MONITOR_CONSUL }})", "command&q ...
- Java中的几种设计模式
如果从事JAVA相关的开发,都不可避免的要用到抽象和封装,这是JAVA的一个特点,同时也是每个开发者必须掌握的,JAVA是这样,Android更是如此.而设计模式就是告诉我们应该如何写出高效且更具应用 ...
- 28. Implement strStr() (String)
Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...
- leetcode 63 不同的路径2
描述: 从左上角走到右下角,中间可能有若干阻碍: 题目给出一个矩阵,0表示可以走,1表示有障碍. 解决: 思路同第一题,只是如果上面或左边有障碍,自身不一定能走,注意些边界条件即可,复杂度仍是m*n. ...
- 子串字谜substring anagrams
[抄题]: 给定一个字符串 s 和一个 非空字符串 p ,找到在 s 中所有关于 p 的字谜的起始索引.字符串仅由小写英文字母组成,字符串 s 和 p 的长度不得大于 40,000.输出顺序无关紧要. ...
- Kafka学习之四 Kafka常用命令
Kafka常用命令 以下是kafka常用命令行总结: 1.查看topic的详细信息 ./kafka-topics.sh -zookeeper 127.0.0.1:2181 -describe -top ...
- Visual Studio2017 设置了vcpkg之后,编译其他程序出问题
博客参考:https://github.com/nodejs/node/issues/23909 错误如下 LNK2005 _SSL_CTX_check_private_key already def ...
- 本周MySQL官方verified/open的bug列表(11月15日至11月21日)
本周MySQL verified的bug列表(11月15日至11月21日) 1. Bug #70923 Replication failure on multi-statement INSERT ...
- cucumber安装步骤
#Start Guide##Environment###1. Install Ruby Verify your installation by running ruby -v in a termina ...