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",它转动之后 ...
随机推荐
- 常用excel技巧
1.excel 设置行列分色显示 =MOD(ROW(),2)=0 2.多表匹配数据 通过身份证在另外一个表查找这个人的基本信息 第一张表 第二张表: =VLOOKUP(F12,'2014总表'!D: ...
- requirejs学习之路
2006年,由于微软的名声比SUN公司的名声要大,选择了asp.net,利用VS开发了很多项目,那个时候觉得自己真是很牛气,什么都能做:现在随着互联网和移动互联的冲击,这些传统技术也受到了冲击,由于A ...
- Python-面向对像及其他
其他相关 1.isinstance(obj,cls) 检查是否obj是类cls的对象 # 针对变量 n = 123 s = "123" print isinstan ...
- 1445 送Q币
1445 送Q币 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 一次在玩网络游戏的过程中,在 ...
- [IIS][ASP.NET]“拒绝访问临时目录”的解决方法
开始以为是“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files”文件夹权限的问题,但怎么设置这个权限也解决不 ...
- Linux 守护进程二(激活守护进程)
//守护进程--读文件 #include <stdio.h> #include <stdlib.h> #include <string.h> #include &l ...
- 编写高效的CSS选择符(节选)
最右边优先 css选择符是从右向左进行匹配的. 样式系统从最右边的选择符开始向左匹配规则.只要当前的选择符的左边还有其他选择符,样式系统就会继续向左移动,直到找到和匹配的元素,或者因为不匹配而退出. ...
- Chrome调试工具简单介绍
作为前端开发者都知道,快捷键F12可以打开chrome调试工具.firefox可以打开firebug工具.“工欲善其事,必先利其器”,对调试工具的掌握,能大大提高我们调试代码的效率.因为我平常chro ...
- 分享到微信微博空间等第三方平台的JS代码
分享功能有利于传播更多优质的内容,所以在web项目中也是比较常用的.今天就抽空整理下常用的分享平台的JS代码.这些代码可以在对应平台的官方网站上生成,官网上对分享内容的参数也有详尽说明.这里只对常用的 ...
- 利用Chrome插件向指定页面植入js,劫持 XSS
资源来自:http://www.2cto.com/Article/201307/225986.html 首页 > 安全 > 网站安全 > 正文 利用Chrome插件向指定页面植入js ...