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\)) 拆环为链,对于原线段\( ...
随机推荐
- NotePad++替换行前、行后空格,替换空行
用 Notepad++ 打开,把每一个将要放在表中单元格的内容放一行(注: ^ 代表行首 $ 代表行尾) 去除行尾空格和空白行:按CTRL+H 选择正则表达式– 查找目标:\s+$ 替换为空 去除行首 ...
- 数据挖掘比赛----Kaggle实战
http://www.cnblogs.com/kobedeshow/p/4118361.html
- Spring Cloud Bus实现自动更新配置
一.概述 1. 配置环境 版本:Spring Boot版本2.0.3.RELEASE,Spring Cloud版本Finchley.SR1,RabbitMQ 3.7.7 说明:本文章是在https:/ ...
- myeclipse10安装了activiti插件后创建BPMN 文件时报错,
以上错误需要,下载一个补丁. 补丁地址:http://www.shareyx.com/blog/2 补丁的安装可以参考: http://jingyan.baidu.com/article/dca1fa ...
- git 本地忽略某些个文件
git update-index --assume-unchanged <要忽略的文件> git update-index --no-assume-unchanged <要取消忽略的 ...
- [leetcode]253. Meeting Rooms II 会议室II
Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...
- How to Get Vertical Line from Point and Line
Description How to get vertical line cross one point which out of line in line. QPoint Line::Vertica ...
- 使用C#进行基于PI的开发
首先欲基于PI-SDK开发PI数据库,必须先安装PI-SDK,然后再VS中新建了一个aspnet网站,添加引用:PI-SDK 1.2 Type Library 和 PISDKCommon 1.2 Ty ...
- K8s基于DNS的服务发现(转)
原文地址:https://www.oschina.net/question/2657833_2201246 1.Kubernetes中如何发现服务 ◆ 发现Pod提供的服务 首先使用nginx-d ...
- C++ 的Tool工具收集
C++ 的Tool工具收集 1. muparser - Fast Math Parser Library 数学公式解析函数,开源工具库 网址: http://muparser.beltoforion. ...