POJ1041 John's trip 【字典序输出欧拉回路】
题目链接: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 【字典序输出欧拉回路】的更多相关文章
- poj1041 John's trip——字典序欧拉回路
题目:http://poj.org/problem?id=1041 求字典序欧拉回路: 首先,如果图是欧拉图,就一定存在欧拉回路,直接 dfs 即可,不用 return 判断什么的,否则TLE... ...
- poj 1041(字典序输出欧拉回路)
John's trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8641 Accepted: 2893 Spe ...
- POJ1041 John's trip
John's trip Language:Default John's trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions: ...
- poj 1041 John's trip——欧拉回路字典序输出
题目:http://poj.org/problem?id=1041 明明是欧拉回路字典序输出的模板. 优先队列存边有毒.写跪.学习学习TJ发现只要按边权从大到小排序连边就能正常用邻接表了! 还有一种存 ...
- UVA302 John's trip(欧拉回路)
UVA302 John's trip 欧拉回路 attention: 如果有多组解,按字典序输出. 起点为每组数据所给的第一条边的编号较小的路口 每次输出完额外换一行 保证连通性 每次输入数据结束后, ...
- 【poj1041】 John's trip
http://poj.org/problem?id=1041 (题目链接) 题意 给出一张无向图,求字典序最小欧拉回路. Solution 这鬼畜的输入是什么心态啊mdzz,这里用vector储存边, ...
- Java实现John's trip(约翰的小汽车)
1 问题描述 John's trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8998 Accepted: 3018 Sp ...
- ZOJ 3204 Connect them(字典序输出)
主要就是将最小生成树的边按字典序输出. 读取数据时,把较小的端点赋给u,较大的端点号赋值给v. 这里要用两次排序,写两个比较器: 第一次是将所有边从小到大排序,边权相同时按u从小到大,u相同时按v从小 ...
- 二叉排序树: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) ...
随机推荐
- BOOTING ELOQUENT MODEL TRAITS
BOOTING ELOQUENT MODEL TRAITS So I've learnt a little Laravel/Eloquent trick today that is very much ...
- 快速掌握Python的捷径-Python基础前传(1)
文: jacky(朱元禄) 开文序 最近看新闻,发现高考都考Python了,随着人工智能的火热,学数据科学的人越来越多了!但对于数据行业本身来说,现象级的火热,这并不是什么好事. 方丈高楼平地起,无论 ...
- [51nod1789] 跑得比谁都快
题面 题解 设\(f[i]\)为根节点到\(i\)的最小耗时 设\(S\)为\(i\)的祖先集合, 可以得到 \[ f[i] = min(f[j] + (i - j)^p),j \in S \] 对于 ...
- 1.RabbitMq - Work 模式
RabbitMq - Work 模式 一.什么是Work模式 如果有几个消息都需要处理,且每个消息的处理时间很长,仅有一个消费者,那么当它在处理一个消息的时候,其他消息就只有等待. 等待有时候是好的, ...
- JAVA基础知识|HTTP协议-发展历程
HTTP 是基于 TCP/IP 协议的应用层协议.它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口. 此文章为转载内容:http://www.ruanyif ...
- centos7下面安装tomcat
前言 对于一个新安装的 centos 系统来说,是没有 tomcat 服务器的.用下面的命令可以查看 tomcat 服务的状态. systemctl status tomcat.service//或者 ...
- sql 同一张表查询不同数据合并之后关联查询
SELECT t.articleId articleId, comments.`comments` parentComment, t.commentId commentsId, comments.`i ...
- display:flex 布局详解(2)
1. flex设置元素垂直居中对齐 在之前的一篇文章中记载过如何垂直居中对齐,方法有很多,但是在学习了flex布局之后,垂直居中更加容易实现 HTML代码: <div class=" ...
- 如何修改Zend Studio代码字体和大小
Zend Studio的默认字体非常小,看起来很费神,这里教大家怎么修改它的字体和大小. 工具/原料 Zend Studio 方法/步骤 Window-->preferences ...
- Android Notification 消息通知 相关资料.md
目录 Android Notification 消息通知 相关资料 Android 5.0 Lollipop (API 21)无法正常显示通知图标,只能看到一个白色方块或灰色方块的问题 解决方案 参考 ...