传送门:欧拉路·二

#1181 : 欧拉路·二

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

在上一回中小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 欧拉路.二的更多相关文章

  1. hihoCoder #1181: 欧拉路·二 (输出路径)

    题意: 给定一个图,要求打印出任一条欧拉路径(保证图肯定有欧拉路). 思路: 深搜的过程中删除遍历过的边,并在回溯时打印出来.在深搜时会形成多个环路,每个环都有一个或多个结点与其他环相扣,这样就可以产 ...

  2. [hihoCoder] 第五十周: 欧拉路·二

    题目1 : 欧拉路·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌. 主角 ...

  3. hiho欧拉路·二 --------- Fleury算法求欧拉路径

    hiho欧拉路·二 分析: 小Ho:这种简单的谜题就交给我吧! 小Hi:真的没问题么? <10分钟过去> 小Ho:啊啊啊啊啊!搞不定啊!!!骨牌数量一多就乱了. 小Hi:哎,我就知道你会遇 ...

  4. hihoCoder #1182 欧拉路·三 (变形)

    题意: 写出一个环,环上有2^n个格子,每个格子中的数字是0或1,相连着的n个格子可以组成一个数的二进制,要求给出这2^n个数字的序列,使得组成的2^n个数字全是不同的.(即从0到2^n-1) 思路: ...

  5. hihoCoder #1176 : 欧拉路·一 (简单)

    题意:给出n个岛,每个岛都有桥到达其他岛,且桥数可多可少(即使两岛有多桥),判断是否是欧拉路(即每条桥只能走一次,所有桥都能遍历1遍). 思路: 满足如下条件之一者即为欧拉路: 1.连通图,每个岛的度 ...

  6. 【HIHOCODER 1181】欧拉路·二

    描述 在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌. 主角继续往前走,面前出现了一座石桥,石桥的尽头有一道火焰墙,似乎无法通过. 小Hi注意到在桥头有一张 ...

  7. 【HIHOCODER 1176】 欧拉路·一

    描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最后的宝藏.现在他们控制的角色来到了一个很大的湖边.湖上有N个小岛(编号1..N),以及连接小岛的 ...

  8. [hihoCoder] 第四十九周: 欧拉路·一

    题目1 : 欧拉路·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最 ...

  9. hiho 1182 : 欧拉路·三

    1182 : 欧拉路·三 这时题目中给的提示: 小Ho:是这样的,每次转动一个区域不是相当于原来数字去掉最左边一位,并在最后加上1或者0么. 于是我考虑对于"XYYY",它转动之后 ...

随机推荐

  1. iOS请求服务器数据去空NSNull

    我们在处理数据库接口的过程中,如果数据中出现null,我们是没法处理的.我在使用NSUserDaults保存后,出现崩溃. null产生原因 null是后台在处理数据的时候,如果没有设置value值, ...

  2. 30Springd的包扫描——<context:component-scan base-package=” ”/>

    在context中配置 如:在base-package指明一个包: <context:component-scan base-package="cn.edu.dao"/> ...

  3. 24Mybatis_延迟加载——用association来实现

    resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: 如果查询订单并且关 ...

  4. 类图和对象图教程-类(Class)、接口(Interface)、协作(collaboration)、依赖关系(Dependency)、泛化关系(Generalization)、关联关系(Association)以及实现关系(Realization)

    类图的概念 (转) 一.概述 类图(Class Diagram)是描述类.接口.协作以及它们之间关系的图,用来显示系统中各个类的静态结构.类图是定义其他图的基础,在类图基础上,可以使用状态图.协作图. ...

  5. javascript限制上传文件大小

    在FireFox.Chrome浏览器中可以根据document.getElementById(“id_file”).files[0].size 获取上传文件的大小(字节数)使用的 api是FileRe ...

  6. jacob下载问题, Office word 此文件正由另一应用程序或用户使用的解决方法

    http://jingyan.baidu.com/article/75ab0bcbd6682fd6864db2db.html

  7. [转]Windows网络编程学习-面向连接的编程方式

    直接附上原文链接:windows 网络编程学习-面向连接的编程方式

  8. 大前端时代已经到来!传智播客2015之WEB前端视频教程(全套教程共15G)

    大前端时代已经到来!传智播客2015之WEB前端视频教程(全套教程共15G)大前端时代已经到来!如今,前端开发工程师的职责,不是只有切图.制作网页这么简单哦! G:\传智播客2015-WEB前端视频教 ...

  9. C语言学习的记忆

    优于他人的技能 会玩双截棍: 我的经验就是Practice make perfect,熟能生巧:还有就是坚持不懈. 关于C语言的学习的回忆 1.我通过老师的教导和课外C语言书籍中学习,和我的技能相比, ...

  10. IOS开发之——类似微信摇一摇的功能实现

    首先,一直以为摇一摇的功能实现好高大上,结果百度了.我自己也模仿写了一个demo.主要代码如下: 新建一个项目,名字为AnimationShake. 主要代码: - (void)motionBegan ...