题目链接:http://poj.org/problem?id=1041

题目大意:给出一个连通图,判断是否存在欧拉回路,若存在输出一条字典序最小的路径。

我的想法:

1.一开始我是用结构体记录边的起点终点以及边的序号,然后将序号按照从小到大排序。再用链式前向星来存以及排好序的边,然后dfs从小到大遍历。但是错了,原因是链式前向星遍历边是反向遍历的,并且并没有将边的序号一一对应上。

正确思路:

1.首先要明白欧拉回路存在的条件。一.连通图(可以用并查集或者tarjan来判断是否连通)。二.无向图每个点的度为偶数,有向图每个点的入度等于出度。所以在判断欧拉回路之前要先判连通以及度。

2.这道题的关键在于数据结构的选择,我用结构体+链式前向星就不行。仔细思考输出边序号的字典序最小,那我们就可以用 G[][]二维数组来表示,G[A][B] = C表示A点通过B边与C相连。这样就可以在dfs中从小到大for一遍B来保证优先选择序号小的边。

3.dfs中利用栈S,在回溯的过程中将路径压入栈中。若此时路径不符合,则代表此次回溯经过的路径应该是在其他路径后面经过的,正好符合栈的输出特点。例如:1-2-3-4-5-6路径回溯时入栈顺序为6-5-4-3-2-1,最后出栈就为1-2-3-4-5-6.正确。

代码里有注释

代码:

注意:因为题目已经说明了保证给出的图是一个连通图,所以这里没有判连通。

注意:数据有问题,数组要开大点,否则会WA

 #include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std; int a, b, c, flag;
int du[], vis[];
int G[][]; //关键数组,G[a][b] = c表示a点通过b边与c相连
int maxm, maxn;
stack<int>S; void init()
{
mem(du, );
mem(G, );
mem(vis, );
maxm = -;
flag = ;
while(!S.empty())
S.pop();
} void dfs(int now)
{
for(int i = ; i <= maxm; i ++) //每次dfs都从小的边开始,保证字典序
{
if(vis[i] || G[now][i] == )//若没有边或者已经走过了
continue;
vis[i] = ;
dfs(G[now][i]);
S.push(i);//回溯过程中将边入栈,最后倒序输出,若一次走不完,那么回溯完找其他路径,这些路径会被压到栈下面,也表示后面再走
}
} int main()
{
while(scanf("%d%d", &a, &b) != EOF)
{
if(a == && b == )
break;
init();
scanf("%d", &c);
du[a] ++, du[b] ++;//度数
G[a][c] = b, G[b][c] = a;
maxm = max(maxm, c);//边数
maxn = max(a, b);//点数
while()
{
scanf("%d%d", &a, &b);
if(a == && b == )
break;
scanf("%d", &c);
du[a] ++, du[b] ++;
G[a][c] = b, G[b][c] = a;
maxm = max(maxm, c);
maxn = max(maxn, max(a, b));
}
for(int i = ; i <= maxn; i ++)
if(du[i] % )
{
flag = ;
break;
}
if(!flag)
{
printf("Round trip does not exist.\n");
continue;
}
dfs();
printf("%d", S.top());
S.pop();
while(!S.empty())
{
printf(" %d", S.top());
S.pop();
}
printf("\n");
}
return ;
}

POJ1041

POJ1041 John's trip 【字典序输出欧拉回路】的更多相关文章

  1. poj1041 John's trip——字典序欧拉回路

    题目:http://poj.org/problem?id=1041 求字典序欧拉回路: 首先,如果图是欧拉图,就一定存在欧拉回路,直接 dfs 即可,不用 return 判断什么的,否则TLE... ...

  2. poj 1041(字典序输出欧拉回路)

    John's trip Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8641   Accepted: 2893   Spe ...

  3. POJ1041 John's trip

    John's trip Language:Default John's trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions: ...

  4. poj 1041 John's trip——欧拉回路字典序输出

    题目:http://poj.org/problem?id=1041 明明是欧拉回路字典序输出的模板. 优先队列存边有毒.写跪.学习学习TJ发现只要按边权从大到小排序连边就能正常用邻接表了! 还有一种存 ...

  5. UVA302 John's trip(欧拉回路)

    UVA302 John's trip 欧拉回路 attention: 如果有多组解,按字典序输出. 起点为每组数据所给的第一条边的编号较小的路口 每次输出完额外换一行 保证连通性 每次输入数据结束后, ...

  6. 【poj1041】 John's trip

    http://poj.org/problem?id=1041 (题目链接) 题意 给出一张无向图,求字典序最小欧拉回路. Solution 这鬼畜的输入是什么心态啊mdzz,这里用vector储存边, ...

  7. Java实现John's trip(约翰的小汽车)

    1 问题描述 John's trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8998 Accepted: 3018 Sp ...

  8. ZOJ 3204 Connect them(字典序输出)

    主要就是将最小生成树的边按字典序输出. 读取数据时,把较小的端点赋给u,较大的端点号赋值给v. 这里要用两次排序,写两个比较器: 第一次是将所有边从小到大排序,边权相同时按u从小到大,u相同时按v从小 ...

  9. 二叉排序树:HUD3999-The order of a Tree(二叉排序树字典序输出)

    The order of a Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

随机推荐

  1. pycharm批量查找替换,正则匹配

    ctrl + r:查找替换 ctrl+f:查找 ctrl+shift+r:全局查找替换 ctrl+alt+f:全局查找 shift+tab将代码左对齐 replace all 完成

  2. php+上传超大文件

    demo下载:http://t.cn/Ai9p3CKQ 教程:http://t.cn/Aipg9uUK 一提到大文件上传,首先想到的是啥??? 没错,就是修改php.ini文件里的上传限制,那就是up ...

  3. bzoj2733永无乡

    永无乡 HYSBZ - 2733 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接, ...

  4. 如何自己实现一个HTMLRunner

    在使用unittest框架时,我们常常需要下载一个HTMLRunnerCN.py用来生成HTML格式的报告,那么我们能不能自己实现一个呢? HTMLRunner是模仿unittest自带的TextTe ...

  5. td中文字居中

    <style> .table_style{width: 100%;height: auto;} .table_style tr td{text-align: center;vertical ...

  6. javascript中的类型转换,宽松相等于严格相等

    为了将值转换为基本类型值(string,number,boolean,null,undefined),抽象操作ToPrimitive会首先检查该值有没有valueOf()方法,如果有并且返回基本类型值 ...

  7. find命令计算代码行数

    [anonymous@localhost ~/lvs/ipvsadm- -regex '.*Makefile.*' -o -regex '.*\.[ch]' -exec cat {} \; | wc ...

  8. HDU2795线段树入门 简单查询和修改

    http://acm.hdu.edu.cn/showproblem.php?pid=2795 #include<iostream> using namespace std; ; int h ...

  9. 使用Git上传文件至Github

    记录一下怎么把文件上传到Github,因为之前都存在本地,没上传过Github,自己以后看起来也有个记忆.因为我自己已经安装好Git和注册好Github账号了,设置好了SSH key.这部分不懂的,就 ...

  10. SpringMVC整合Springfox-Swagger

    https://www.jianshu.com/p/ab10860945c3 验证通过 关于Swagger的简介就不占篇幅了... 本文使用的Springfox-Swagger版本为2.8.0 要整合 ...