目录

1 问题描述

2 解决方案

 


1 问题描述

John's trip
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 8998   Accepted: 3018   Special Judge

Description

Little Johnny has got a new car. He decided to drive around the town to visit his friends. Johnny wanted to visit all his friends, but there was many of them. In each street he had one friend. He started thinking how to make his trip as short as possible. Very soon he realized that the best way to do it was to travel through each street of town only once. Naturally, he wanted to finish his trip at the same place he started, at his parents' house.

The streets in Johnny's town were named by integer numbers from 1 to n, n < 1995. The junctions were independently named by integer numbers from 1 to m, m <= 44. No junction connects more than 44 streets. All junctions in the town had different numbers. Each street was connecting exactly two junctions. No two streets in the town had the same number. He immediately started to plan his round trip. If there was more than one such round trip, he would have chosen the one which, when written down as a sequence of street numbers is lexicographically the smallest. But Johnny was not able to find even one such round trip.

Help Johnny and write a program which finds the desired shortest round trip. If the round trip does not exist the program should write a message. Assume that Johnny lives at the junction ending the street appears first in the input with smaller number. All streets in the town are two way. There exists a way from each street to another street in the town. The streets in the town are very narrow and there is no possibility to turn back the car once he is in the street

Input

Input file consists of several blocks. Each block describes one town. Each line in the block contains three integers x; y; z, where x > 0 and y > 0 are the numbers of junctions which are connected by the street number z. The end of the block is marked by the line containing x = y = 0. At the end of the input file there is an empty block, x = y = 0.

Output

Output one line of each block contains the sequence of street numbers (single members of the sequence are separated by space) describing Johnny's round trip. If the round trip cannot be found the corresponding output block contains the message "Round trip does not exist."

Sample Input

1 2 1
2 3 2
3 1 6
1 2 5
2 3 3
3 1 4
0 0
1 2 1
2 3 2
1 3 3
2 4 4
0 0
0 0

Sample Output

1 2 3 5 4 6
Round trip does not exist.

Source


2 解决方案

具体代码如下:

package com.liuzhen.practice;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner; public class Main {
public static int MAX = 100; //题意说明,最多44个路口
public static int start; // Johnny出发起点
public static int[] id = new int[MAX];
public static int[] degree = new int[MAX]; //用于计算给定图每个顶点的度
public static boolean[] used = new boolean[2000]; //用于判断图中相应边是否被遍历
public static int[] path = new int[MAX];
public static int count; //用于统计行走路径的街道数
public static ArrayList<String> result = new ArrayList<String>(); class MyComparator implements Comparator<edge> {
public int compare(edge o1, edge o2) {
if(o1.street > o2.street)
return 1;
else if(o1.street < o2.street)
return -1;
else
return 0;
}
} static class edge {
public int a; //边的起点
public int b; //边的终点
public int street; //街道 public edge(int a, int b, int street) {
this.a = a;
this.b = b;
this.street = street;
}
}
//寻找顶点a的根节点
public int find(int[] id, int a) {
int root = a;
while(id[root] >= 0) {
root = id[root];
}
int i;
int k = a;
while(k != root) {
i = id[k];
id[k] = root;
k = i;
}
return root;
}
//合并顶点a和顶点b所在的树
public void union(int[] id, int a, int b) {
int rootA = find(id, a);
int rootB = find(id, b);
int rootNum = id[rootA] + id[rootB];
if(id[rootA] < id[rootB]) {
id[rootB] = rootA;
id[rootA] = rootNum;
} else{
id[rootA] = rootB;
id[rootB] = rootNum;
}
return;
} public void init() {
for(int i = 0;i < 50;i++) {
id[i] = -1; //初始化所有顶点所在树的根节点编号为-1
degree[i] = 0;
path[i] = -1;
count = 0;
}
for(int i = 0;i < 2000;i++) {
used[i] = false;
}
return;
} public boolean judge(ArrayList<edge>[] map) {
int root = find(id, start);
for(int i = 0;i < MAX;i++) {
if(map[i].size() == 0)
continue;
Collections.sort(map[i], new MyComparator());
for(int j = 0;j < map[i].size();j++) {
if(find(id, map[i].get(j).b) != root)
return false;
}
}
for(int i = 0;i < MAX;i++) {
if(degree[i] % 2 != 0)
return false;
}
return true;
} public void dfs(ArrayList<edge>[] map, int start) {
for(int i = 0;i < map[start].size();i++) {
if(!used[map[start].get(i).street]) {
used[map[start].get(i).street] = true;
path[count++] = map[start].get(i).street;
dfs(map, map[start].get(i).b);
}
}
} public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
while(true) {
int a1 = in.nextInt();
int b1 = in.nextInt();
if(a1 == 0 && b1 == 0)
break;
int c1 = in.nextInt();
start = Math.min(a1, b1); //Johnny出发起点
test.init(); //初始化输入顶点的度和所在树的根节点
@SuppressWarnings("unchecked")
ArrayList<edge>[] map = new ArrayList[MAX];
for(int i = 0;i < MAX;i++) {
map[i] = new ArrayList<edge>();
}
map[a1].add(new edge(a1, b1, c1));
map[b1].add(new edge(b1, a1, c1));
degree[a1]++;
degree[b1]++;
test.union(id, a1, b1); //合并顶点a1和顶点b1所在树
while(true) {
int a = in.nextInt();
int b = in.nextInt();
if(a == 0 && b == 0)
break;
int c = in.nextInt();
map[a].add(new edge(a, b, c));
map[b].add(new edge(b, a, c));
degree[a]++;
degree[b]++;
test.union(id, a, b);
}
String tempR = "";
if(test.judge(map)) {
test.dfs(map, start);
for(int i = 0;i < count;i++) {
tempR = tempR + path[i] + " ";
}
} else {
tempR = "Round trip does not exist.";
}
result.add(tempR);
}
for(int i = 0;i < result.size();i++)
System.out.println(result.get(i));
}
}

运行结果:

1 2 1
2 3 2
3 1 6
1 2 5
2 3 3
3 1 4
0 0
1 2 1
2 3 2
1 3 3
2 4 4
0 0
0 0
1 2 3 5 4 6
Round trip does not exist.

参考资料:

1.欧拉回路

算法笔记_142:无向图的欧拉回路求解(Java)的更多相关文章

  1. 算法笔记_141:无向图的欧拉回路判断问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 Problem Description 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回 ...

  2. 算法笔记_148:有向图欧拉回路求解(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 Description A catenym is a pair of words separated by a period such that t ...

  3. 算法笔记_183:历届试题 九宫重排(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成 ...

  4. 算法笔记_177:历届试题 城市建设(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修.市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他. C市中有 ...

  5. 算法笔记_135:格子取数问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 有n*n个格子,每个格子里有正数或者0,从最左上角往最右下角走,只能向下和向右走,一共走两次(即从左上角往右下角走两趟),把所有经过的格子里的数加起 ...

  6. 算法笔记_046:跳台阶问题(Java)

    目录 1 问题描述 2 解决方案 2.1 递归法 2.2 迭代法   1 问题描述 一个台阶总共有n级,如果一次可以跳1级,也可以跳2级,求总共有多少种跳法. 2 解决方案 2.1 递归法 如果整个台 ...

  7. 算法笔记_045:币值最大化问题(Java)

    目录 1 问题描述 2 解决方案 2.1 动态规划法   1 问题描述 给定一排n个硬币,其面值均为正整数c1,c2,...,cn,这些整数并不一定两两不同.请问如何选择硬币,使得在其原始位置互不相邻 ...

  8. 算法笔记_029:约瑟夫斯问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 引用自<算法设计与分析基础>第三版: 约瑟夫斯问题,是以弗拉瓦斯.约瑟夫斯(Flavius Josephus)的名字命名的.约瑟夫斯是一 ...

  9. 算法笔记_051:荷兰国旗问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球.白球.蓝球.这个问题之所以叫荷兰国旗,是因为 ...

随机推荐

  1. 【BZOJ 4663】 (最小割)

    4663: Hack Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 69  Solved: 26 Description 由于 FZYZ 教学区禁止使 ...

  2. 数据准备<1>:数据质量检查-理论篇

    数据行业有一句很经典的话--"垃圾进,垃圾出"(Garbage in, Garbage out, GIGO),意思就是,如果使用的基础数据有问题,那基于这些数据得到的任何产出都是没 ...

  3. SpringBoot 搭建简单聊天室

    SpringBoot 搭建简单聊天室(queue 点对点) 1.引用 SpringBoot 搭建 WebSocket 链接 https://www.cnblogs.com/yi1036943655/p ...

  4. DiskFileUpload上传与Spring的CommonsMultipartResolver上传对比

    最近在做一个小小的上传功能竟被虐得体无完肤, 在使用tomcat内置的DiskFileUpload获取前台jsp传来的附件参数和其他表单参数, 竟然出现莫名其妙的乱码问题, 即使tomcat的serv ...

  5. Google Code Jam Africa 2010 Qualification Round Problem A. Store Credit

    Google Code Jam Qualification Round Africa 2010 Problem A. Store Credit https://code.google.com/code ...

  6. qt程序运行时的错误error:undefined reference to `_imp___ZN10QTcpSocketD1Ev'

    出现的错误: undefined reference to `_imp___ZN10QTcpSocketD1Ev' undefined reference to `_imp___ZN10QTcpSoc ...

  7. asp.net 链接数据库ADO.NET

    web.config <configuration> <connectionStrings> <add name="constr" connectio ...

  8. linux之inode

    一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统读取硬盘的时候,不会 ...

  9. Assignment (HDU 2853 最大权匹配KM)

    Assignment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  10. Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行

    Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行 Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执 ...