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",它转动之后 ...
随机推荐
- sublime配置全攻略
大家好,今天给大家分享一款编辑器:sublime text2 我用过很多编辑器, EditPlus.EmEditor.Notepad++.Notepad2.UltraEdit.Editra.V ...
- UICollectionView移动
collectionView在iOS9中发布了一个可以移动cell的新特性,实现如下: 1.创建collectionView并设置代理 - (UICollectionView *)collection ...
- 07Spring_bean属性的依赖注入-重点@Autowriter
在spring2.5 版本,没有提供基本类型属性注入 ,但是spring3.0引入注解@Value 所以在Spring3.0中属性的注入只可以这么写.
- Android 判断现在系统存储器是“手机存储”还是“SD存储”
import android.os.storage.StorageManager; String fileDir = null; StorageManager storageMa ...
- WP老杨解迷:评论数和下载量、榜单的关系
书接上回,继续研讨评论系统的深层经验,这次从另外一个角度看清榜单关系,提升装逼水准2个加号,如果你能看懂本文,并活学活用,足可在Win10之前醉卧隆中,通晓Windows Phone市场风云变幻,哪些 ...
- 磁盘操作- inode/Block深入实战
一 思路: 1,磁盘物理结构及大小计算 2,分区 MBR GPT知识 3,fdisk分区 挂载 自动挂载 4,格式化文件系统 5,inode block 软硬链接 查看磁盘: [root@moban ...
- no2.crossdomain.xml批量读取(待完善)
读取太多url有问题 #coding=utf-8 import urllib import requests import sys import re import time def getxml(u ...
- An Introduction to Interactive Programming in Python (Part 1) -- Week 2_3 练习
Mini-project description - Rock-paper-scissors-lizard-Spock Rock-paper-scissors is a hand game that ...
- GEOS库学习之三:空间关系、DE-9IM和谓词
要判断两个多边形的关系,实际上属于几何图形空间关系判断.几何图形并不只有多边形一种,它包括点.线.面构成的任何图形,两两之间相互关系也有很多种,因此空间关系非常复杂.根据前人的研究,总结出了DE-9I ...
- $self $index $first $last parent() outerParent()
index5.html <html><head> <title>$self $index $first $last parent() outerParent()&l ...