hihocoder 1181 欧拉路.二
传送门:欧拉路·二
#1181 : 欧拉路·二
描述
在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌。
主角继续往前走,面前出现了一座石桥,石桥的尽头有一道火焰墙,似乎无法通过。小Hi注意到在桥头有一张小纸片,于是控制主角捡起了这张纸片,只见上面写着:
将M块骨牌首尾相连放置于石桥的凹糟中,即可关闭火焰墙。切记骨牌需要数字相同才能连接。
——By 无名的冒险者
小Hi和小Ho打开了主角的道具栏,发现主角恰好拥有M快骨牌。小Ho:也就是说要把所有骨牌都放在凹槽中才能关闭火焰墙,数字相同是什么意思?小Hi:你看,每一块骨牌两端各有一个数字,大概是只有当数字相同时才可以相连放置,比如:
小Ho:原来如此,那么我们先看看能不能把所有的骨牌连接起来吧。 提示:Fleury算法求欧拉路径
输入
第1行:2个正整数,N,M。分别表示骨牌上出现的最大数字和骨牌数量。1≤N≤1,000,1≤M≤5,000第2..M+1行:每行2个整数,u,v。第i+1行表示第i块骨牌两端的数字(u,v),1≤u,v≤N
输出
第1行:m+1个数字,表示骨牌首尾相连后的数字比如骨牌连接的状态为(1,5)(5,3)(3,2)(2,4)(4,3),则输出"1 5 3 2 4 3"你可以输出任意一组合法的解。
- 样例输入
5 5
3 5
3 2
4 2
3 4
5 1
- 样例输出
- 1 5 3 4 2 3
这道题的要点是如何实现删边,对一种用数组实现的临接表(可以取代vector<int>)稍加修改便可。
struct edge{
int to, prev, next;
};
edge E[MAX_E<<]; //error-prone
int path[MAX_E];
int pos[MAX_V], size[MAX_V];
int path_size;
void add_edge(int &id, int u, int v){
E[id].to=v;
E[pos[u]].next=id;
E[id].prev=pos[u];
E[id].next=-;
pos[u]=id++;
size[u]++;
}
void get_graph(int E){
int id=;
int u, v;
while(E--){
scanf("%d%d", &u, &v);
add_edge(id, u, v);
add_edge(id, v, u);
}
}
void move_edge(int u, int now){
int &pre=E[now].prev;
if(~pre){
E[pre].next=E[now].next;
}
int &nt=E[now].next;
if(~nt){
E[nt].prev=E[now].prev;
}
else{
pos[u]=E[now].prev;
}
}
我们看到实现删边只需增加一个next域(field)。
注意:上面代码中的get_graph函数中应当包含如下的初始化
memset(pos, -, sizeof(pos));
memset(size, , sizeof(size));
我写在main()中了,这是不可缺少的。
完整代码:
#include<bits/stdc++.h>
#define set1(a) memset(a, -1, sizeof(a))
#define set0(a) memset(a, 0, sizeof(a))
using namespace std;
const int MAX_V=1e3+, MAX_E=5e3+;
struct edge{
int to, prev, next;
};
edge E[MAX_E<<]; //error-prone
int path[MAX_E];
int pos[MAX_V], size[MAX_V];
int path_size;
void add_edge(int &id, int u, int v){
E[id].to=v;
E[pos[u]].next=id;
E[id].prev=pos[u];
E[id].next=-;
pos[u]=id++;
size[u]++;
} void get_graph(int E){
int id=;
int u, v;
while(E--){
scanf("%d%d", &u, &v);
add_edge(id, u, v);
add_edge(id, v, u);
}
}
void move_edge(int u, int now){
int &pre=E[now].prev;
if(~pre){
E[pre].next=E[now].next;
}
int &nt=E[now].next;
if(~nt){
E[nt].prev=E[now].prev;
}
else{
pos[u]=E[now].prev;
}
}
void dfs(int u){
int now;
while(now=pos[u], ~now){ //error-prone
int &v=E[now].to;
move_edge(u, now);
move_edge(v, now^);
dfs(v);
}
path[path_size++]=u;
}
int main(){
freopen("in", "r", stdin);
int V, E;
scanf("%d%d", &V, &E);
set1(pos);
set0(size);
get_graph(E);
path_size=;
int beg=;
for(int i=; i<=V; i++){
if(size[i]&){
beg=i;
break;
}
}
dfs(beg);
for(int i=; i<path_size; i++){
printf("%d ", path[i]);
}
puts("");
return ;
}
请特别注意第 48、49 行是如何删边的。我们看到这种用数组实现的邻接表是比较灵活与实用的。
hihocoder 1181 欧拉路.二的更多相关文章
- hihoCoder #1181: 欧拉路·二 (输出路径)
题意: 给定一个图,要求打印出任一条欧拉路径(保证图肯定有欧拉路). 思路: 深搜的过程中删除遍历过的边,并在回溯时打印出来.在深搜时会形成多个环路,每个环都有一个或多个结点与其他环相扣,这样就可以产 ...
- [hihoCoder] 第五十周: 欧拉路·二
题目1 : 欧拉路·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌. 主角 ...
- hiho欧拉路·二 --------- Fleury算法求欧拉路径
hiho欧拉路·二 分析: 小Ho:这种简单的谜题就交给我吧! 小Hi:真的没问题么? <10分钟过去> 小Ho:啊啊啊啊啊!搞不定啊!!!骨牌数量一多就乱了. 小Hi:哎,我就知道你会遇 ...
- hihoCoder #1182 欧拉路·三 (变形)
题意: 写出一个环,环上有2^n个格子,每个格子中的数字是0或1,相连着的n个格子可以组成一个数的二进制,要求给出这2^n个数字的序列,使得组成的2^n个数字全是不同的.(即从0到2^n-1) 思路: ...
- hihoCoder #1176 : 欧拉路·一 (简单)
题意:给出n个岛,每个岛都有桥到达其他岛,且桥数可多可少(即使两岛有多桥),判断是否是欧拉路(即每条桥只能走一次,所有桥都能遍历1遍). 思路: 满足如下条件之一者即为欧拉路: 1.连通图,每个岛的度 ...
- 【HIHOCODER 1181】欧拉路·二
描述 在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌. 主角继续往前走,面前出现了一座石桥,石桥的尽头有一道火焰墙,似乎无法通过. 小Hi注意到在桥头有一张 ...
- 【HIHOCODER 1176】 欧拉路·一
描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最后的宝藏.现在他们控制的角色来到了一个很大的湖边.湖上有N个小岛(编号1..N),以及连接小岛的 ...
- [hihoCoder] 第四十九周: 欧拉路·一
题目1 : 欧拉路·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最 ...
- hiho 1182 : 欧拉路·三
1182 : 欧拉路·三 这时题目中给的提示: 小Ho:是这样的,每次转动一个区域不是相当于原来数字去掉最左边一位,并在最后加上1或者0么. 于是我考虑对于"XYYY",它转动之后 ...
随机推荐
- 5050 [JL] 他爱上了鸭蛋
5050 [JL] 他爱上了鸭蛋 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 小明爱上了零鸭蛋.他喜欢输 ...
- 如何利用ThoughtWorks.QRCode 生成二维码
1.引用ThoughtWorks.QRCode.dll 在nuget上查找即可引用,也可自行下载 2.生成二维码静态方法 参数: 二维码内容:fileUrl 二维码图片名:typeName #regi ...
- 墙国内新建Rails应用的要点(windows 7环境, Rails 4.2.0)
1. 使用rails new 命令创建完的应用在自动执行bundle install不会成功,根据出错提示,判断原因有可能是被墙与https的证书的安全性问题. 作为开发环境,选用绕开的办法,在目录 ...
- cobbler
原理: http://www.cnblogs.com/mchina/p/centos-pxe-kickstart-auto-install-os.html 一键脚本 http://tshare365. ...
- MVC4 WebAPI
不管是因为什么原因,结果是在新出的MVC中,增加了WebAPI,用于提供REST风格的WebService,个人比较喜欢REST风格的WebService,感觉比SOAP要轻量级一些,而且对客户端的要 ...
- java加解密操作过程中的中文乱码问题
import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import ...
- Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android Tool
重装操作系统后,要重新配置Android开发环境.配置成功后,添加原本项目时却出现了错误! Android requires compiler compliance level 5.0 or 6.0. ...
- 破解windows server 2008 的登录密码。有效的
今天拿到一块以前服务器上替换下来的老盘,里面还有系统.挂载到另外一台闲置服务器,发现密码忘记了, 结果拿出pe和以前修改xp和2003的系统那样去修改发现不行,不知道为什么,修改SAM文件明明提示成功 ...
- 转 一篇关于sql server 三种恢复模式的文章,从sql server 的机制上来写的,感觉很不错,转了
简介 SQL Server中的事务日志无疑是SQL Server中最重要的部分之一.因为SQL SERVER利用事务日志来确保持久性(Durability)和事务回滚(Rollback).从而还部分确 ...
- C#基础知识系列四(运算符汇总)
前言 本节主要来讲C#中的各种运算符.主要包括is运算符.as运算符.checked和unchecked运算符.sizeof运算符.空接合运算符(??).&和&&.移位运算符 ...