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",它转动之后 ...
 
随机推荐
- LSB最低有效位隐写入门
			
LSB也就是最低有效位 (Least Significant Bit) 被替换成传递的信息字节.对原图影响很小. 这题可以算是隐写工具[wbStego]的使用入门练习题吧. 第一步,告诉你工具是支持在 ...
 - phpmyadmin后台拿shell方法总结
			
方法一: CREATE TABLE `mysql`.`xiaoma` (`xiaoma1` TEXT NOT NULL ); INSERT INTO `mysql`.`xiaoma` (`xiaoma ...
 - andorid 自定义seekbar
			
效果如图: <?xml version="1.0" encoding="utf-8"?> <resources> <style n ...
 - 如何等到所有的图片都加载完成之后触发一次onload事件
			
var details_img = $(".details img"); //所有的图片 var img_len = details_img.length; details_img ...
 - RelayCommand命令
			
原文:http://www.cnblogs.com/xiepeixing/archive/2013/08/13/3255152.html 常用Wpf开发中我们在ViewModel中实现INotifyP ...
 - DRDB报错------0: Failure: (119) No valid meta-data signature found.
			
一. 错误 drbdadm create-md datadrbdadm up data <--启动时报错 [root@data-- ~]# drbdadm up data : Failure: ...
 - C++ 排序、查找的应用
			
// order.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "string.h" #includ ...
 - Linux 读书笔记 二
			
一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 若不小心登出后,直接刷新页面即可 2. 环境使用 完成实验后可以点击桌面上方的“实验截图”保存并分 ...
 - zoeDylan.js框架-数据底层
			
zoeDylan.js是墨芈自己写的一套前端框架,不过由于墨芈经验不足,所以框架内部代码有些混乱. 墨芈写这套框架的目的是为了存储以后做前端开发过程中的一些代码,简单的说这套框架就是一个大杂烩. 这套 ...
 - JavaScript和html5 canvas生成圆形印章
			
代码: function createSeal(id,company,name){ var canvas = document.getElementById(id); var context = ca ...