UVA302 John's trip

给定一张图和起点,求从起点开始能否把每条边遍历一次后返回起点,并输出字典序最小的路径。

欧拉回路裸题,若可以达到题目的要求,则图中必然存在一条欧拉回路。我们可以记录每个点的连的边数,如果出现一个点连的边数为奇数,那么图中必定不存在欧拉回路,输出 Round trip does not exist. 即可。原因是如果存在欧拉回路,那么回到起点前,走到每个点时必定还有一条路离开。所以走到一个点是一条路,离开一个点又是一条路,合起来就是两条路。如果一个点被经过两次,那么就是四条路。易得欧拉回路中每个点连的边数为偶数。

然后,对于存在欧拉回路的情况,我们可以从起点出发进行 DFS。由于题目要求输出字典序最小的路径,所以我们先遍历编号小的边。参照输出经过的点的路径的做法,当一条边遍历完成之后,将其压入栈中,最后倒序输出。

注意,这里有一个小坑点:如果一条边在遍历中走过了,由于每一条边只能经过一次,所以就不能再走了,这点和输出经过的点的路径不一样。所以,在走边都时候要注意判断这条边已经走过没有,否则会得到错误结果。

另外,再重复一遍翻译里的话:每次输出完额外换一行

#include <bits/stdc++.h>
using namespace std;
struct egde
{
int v,next,d;
}e[30000];
struct edgein
{
int d,t;
};
int n,m,b,d[30000],h[30000],lu[60000],book[30000],cnt=0,tol=0;
bool cmp(struct edgein a,struct edgein b)
{
return a.d<b.d;
} void add_edge(int u,int v,int d)
{
e[++tol].next=h[u];
e[tol].v=v;
e[tol].d=d;
h[u]=tol;
} void dfs(int now)
{
int cn=0;
struct edgein s[2000];
for(int i=h[now];i;i=e[i].next)
if(!book[e[i].d])s[++cn].d=e[i].d,s[cn].t=e[i].v;
if(cn==0)return;
sort(s+1,s+cn+1,cmp);
for(int i=1;i<=cn;i++)
if(!book[s[i].d])
{
int k=s[i].d;
book[s[i].d]=1;
dfs(s[i].t);
lu[++cnt]=k;
}
} int main()
{
int u=0,v=0;
while(scanf("%d%d",&u,&v)!=-1)
{
if(u==0&&v==0)break;
int flag1=1,flag2=0,flag3=0;
scanf("%d",&b);
n=max(n,max(u,v));m=min(u,v);
d[u]++;d[v]++;
add_edge(u,v,b);add_edge(v,u,b);
while(scanf("%d%d",&u,&v)!=-1)
{
if(u==0&&v==0)break;
scanf("%d",&b);
n=max(n,max(u,v));
d[u]++;d[v]++;
add_edge(u,v,b);add_edge(v,u,b);
}
for(int i=1;i<=n;i++)
{
if(d[i]%2)flag3=1,flag1++;
else if(d[i]%2&&i==m)flag2=1;
}
flag1=(flag1<=2)&&(!(flag2^flag3));
if(flag1)
{
dfs(m);
for(int i=cnt;i>0;i--)
if(i!=1)printf("%d ",lu[i]);
else printf("%d",lu[i]);
printf("\n\n");
}
else printf("Round trip does not exist.\n\n");
cnt=0;tol=0;
memset(h,0,sizeof(h));memset(lu,0,sizeof(lu));memset(d,0,sizeof(d));
memset(book,0,sizeof(book));
}
return 0;
}

AC记录

UVA302 John's trip 题解的更多相关文章

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

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

  2. POJ1041 John's trip

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

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

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

  4. 【poj1041】 John's trip

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

  5. poj 1041 John's trip 欧拉回路

    题目链接 求给出的图是否存在欧拉回路并输出路径, 从1这个点开始, 输出时按边的升序输出. 将每个点的边排序一下就可以. #include <iostream> #include < ...

  6. POJ 1041 John's trip 无向图的【欧拉回路】路径输出

    欧拉回路第一题TVT 本题的一个小技巧在于: [建立一个存放点与边关系的邻接矩阵] 1.先判断是否存在欧拉路径 无向图: 欧拉回路:连通 + 所有定点的度为偶数 欧拉路径:连通 + 除源点和终点外都为 ...

  7. John's trip POJ - 1041(这题数据有点水)

    题意: 其实还是一个欧拉回路,但要按字典序走路: 解析: 我真是蠢啊emm... map[i][j]表示由顶点i经街道j会到达的顶点编号 然后枚举j就好了 用栈储存.. 虽然我不是这样写的 #incl ...

  8. John's trip(POJ1041+欧拉回路+打印路径)

    题目链接:http://poj.org/problem?id=1041 题目: 题意:给你n条街道,m个路口,每次输入以0 0结束,给你的u v t分别表示路口u和v由t这条街道连接,要输出从起点出发 ...

  9. [POJ 1041] John's Trip

    [题目链接] http://poj.org/problem?id=1041 [算法] 欧拉回路[代码] #include <algorithm> #include <bitset&g ...

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

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

随机推荐

  1. 云备份技术解析:云容灾 CT-CDR 关键技术介绍

    本文分享自天翼云开发者社区<云备份技术解析:云容灾 CT-CDR 关键技术介绍>,作者:沈****军 1.CDP+存储快照,实现秒级RPO (1)CDP技术:云容灾CT-CDR(Cloud ...

  2. springAPI对事物支持之注解式配置

    一.无Spring核心配置文件:applicationContext.xml下开启注解式事物 @Configuration @EnableTransactionManagement public cl ...

  3. surging 集成SuperSocket预发布版本2.0

    一.概述 周末在家试着扩展SuperSocket,因为之前都是只支持.net framework, 后面出现支持.NET CORE 的SuperSocket 2.0 ,然后集成进来和dotnetty ...

  4. python实例:导入会员数据后,读取数据文件,检查导入正确性(整列取excel值、合并列、response取值)

    场景描述:某系统新上线,老系统的会员数据要导入新系统中,包含手机号,上级信息和会员余额.有1万多条数据,手工对比过于繁琐,用python自动化处理 思路:系统导入数据后,脚本读取文件,先把会员数据取出 ...

  5. ADTF: 助力自动驾驶系统开发的强大工具箱!

    在过去十年中,自动驾驶和高级驾驶辅助系统(AD/ADAS)软件与硬件的快速发展对多传感器数据采集的设计需求提出了更高的要求.然而,目前仍缺乏能够高质量集成多传感器数据采集的解决方案. 康谋ADTF正是 ...

  6. CTF_RSA解密学习

    CTF_RSA解密学习 00X00 .先看了一边李永乐老师的视频 https://www.bilibili.com/video/av26639065/ 00X01.对称.非对称算法了解 对称算法,加解 ...

  7. wso2~介绍

    1. Wso2-apim的介绍 WSO2 API Manager 是一个开源的 API 管理解决方案,旨在帮助组织设计.发布.管理和分析 API.它提供了全面的功能,支持企业在现代应用程序开发中实现更 ...

  8. maven-helper解决依赖冲突

    idea中可以使用maven-helper解决依赖冲突

  9. 深入理解 JavaScript 模板引擎

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  10. CSS 之overflow属性简结

    CSS的overflow 属性用来处理一个元素的尺寸超出其容器尺寸的情况.当一个元素包含的内容超粗自身的大小时,就会发生内容溢出,这种情况,可以对内容进行"裁剪",只让一部分内容可 ...