目录

1 问题描述

2 解决方案

 


1 问题描述

具体链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=995


2 解决方案

具体代码如下:

package com.liuzhen.practice;

import java.util.ArrayList;
import java.util.Scanner; public class Main {
public static int MAX = 1000;
public static int start, count;
public static int num = 0;
public static int[] id = new int[MAX];
public static int[] degree = new int[MAX]; //用于计算给定图每个顶点的度
public static boolean[] used = new boolean[MAX]; //用于判断图中相应边是否被遍历
public static String[] path = new String[MAX];
public static ArrayList<String> result = new ArrayList<String>(); static class edge {
public int a; //边的起点
public int b; //边的终点
public int num; //边的编号 public edge(int a, int b, int num) {
this.a = a;
this.b = b;
this.num = num;
} public String getAB() {
return a + " "+ b;
}
}
//寻找顶点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);
if(rootA == rootB)
return;
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() {
count = 0;
for(int i = 0;i < 51;i++) {
id[i] = -1; //初始化所有顶点所在树的根节点编号为-1
degree[i] = 0;
}
for(int i = 0;i < MAX;i++) {
used[i] = false;
path[i] = "";
}
return;
} public boolean judge(ArrayList<edge>[] map) {
int root = find(id, start);
for(int i = 0;i < map.length;i++) {
for(int j = 0;j < map[i].size();j++) {
if(root != find(id, map[i].get(j).b))
return false;
}
}
for(int i = 0;i < degree.length;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).num]) {
used[map[start].get(i).num] = true;
path[count++] = map[start].get(i).getAB();
dfs(map, map[start].get(i).b);
}
}
} public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
int t = in.nextInt(); //总共要输入的图的数目
while(t > 0) {
t--;
@SuppressWarnings("unchecked")
ArrayList<edge>[] map = new ArrayList[51];
for(int i = 0;i < 51;i++)
map[i] = new ArrayList<edge>();
int k = in.nextInt(); //一次输入图的边数目
test.init();
for(int i = 0;i < k;i++) {
int a = in.nextInt();
int b = in.nextInt();
map[a].add(new edge(a, b, num));
map[b].add(new edge(b, a, num++));
degree[a]++;
degree[b]++;
test.union(id, a, b);
start = a;
}
String temp = "";
if(test.judge(map)) {
test.dfs(map, start);
for(int i = 0;i < k;i++) {
temp = temp + path[i] + "\n";
}
} else {
temp = "some beads may be lost";
}
result.add(temp);
}
for(int i = 0;i < result.size();i++) {
System.out.println("Case #"+(i+1));
System.out.println(result.get(i)+"\n");
}
}
}

运行结果:

2
5
1 2
2 3
3 4
4 5
5 6
5
2 1
2 2
3 4
3 1
2 4
Case #1
some beads may be lost Case #2
2 1
1 3
3 4
4 2
2 2

参考资料:

1.欧拉回路

算法笔记_143:构造无向图的欧拉回路(Java)的更多相关文章

  1. Java实现构造无向图的欧拉回路( The Necklace)

    中文翻译: 但是,唉!一天,项链被撕破了,珠子散落在屋檐上.我姐姐尽力把地板上的珠子都捡起来了.但她不确定自己是否能收集到所有的照片.现在,她来找我帮忙.她想知道是否有可能让克劳斯使用她在里面的所有珠 ...

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

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

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

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

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

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

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

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

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

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

  7. 算法笔记_074:子集和问题(Java)

    目录 1 问题描述 2 解决方案 2.1 全排列思想求解 2.2 状态空间树思想求解   1 问题描述 求n个正整数构成的一个给定集合A = {a1,a2,a3,...,an}的子集,子集的和要等于一 ...

  8. 算法笔记_232:提取拼音首字母(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 在很多软件中,输入拼音的首写字母就可以快速定位到某个词条.比如,在铁路售票软件中,输入: “bj”就可以定位到“北京”.怎样在自己的软件中实现这个功 ...

  9. 算法笔记_231:网格中移动字母(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 2x3=6个方格中放入ABCDE五个字母,右下角的那个格空着.如图[1.jpg]所示. 和空格子相邻的格子中的字母可以移动到空格中,比如,图中的C和 ...

随机推荐

  1. 【20181027T2】易水决【贪心+堆】

    原题:loj6035 [错解] 全肝T1了没怎么想 [正解] 一眼贪心 先考虑\(b_i=0\)怎么做 可以模拟一个正常人的思维 开一个堆,记录每个任务需要的时间(包括等待),每次从中取出一个任务,表 ...

  2. SpringMVC集成Swagger插件以及Swagger注解的简单使用

    一.简介 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新 .接口的方法,参数和模型 ...

  3. bzoj 3872: [Poi2014]Ant colony -- 树形dp+二分

    3872: [Poi2014]Ant colony Time Limit: 30 Sec  Memory Limit: 128 MB Description   There is an entranc ...

  4. 对jQuery的事件绑定的一些思考

    jQuery的事件绑定 问题 首先我们看下面的一个非经常见的事件绑定代码: //example $('#dom').click(function(e){ //do something }); $('# ...

  5. Java ClassLoader加载机制理解 实际例子

    针对 Java ClassLoader加载机制理解, 做了个如何自定制简单的ClassLoader,并成功加载指定的类. 不废话,直接上代码. package com.chq.study.cl; im ...

  6. 怎样用git提交多次改动

    在提交完代码后,我们发现所改动的文件还有须要完好的地方,可是我们已经upload过了可是还未合入到库上,此时要提交新的改动有两种做法: 一是等上次的改动合入到库上后,再次upload提交一次,这明显是 ...

  7. Node 多进程并发控制小模块 - lockman

    介绍 lockman 是一个用于多进程的并发控制锁, 类似一些语言中(比如 C#)的 lock 关键字可以用来确保代码块完成运行,而不会被其他进程中断.它可以把一段代码定义为互斥段(critical ...

  8. 突破技术管理,IT人中年危机变契机

    突破技术管理,IT人中年危机变契机 中生代技术 Yesterday 作为一个老技术人,今天不聊技术,就聊点技术人员职业发展的事情:对技术管理岗位的认知,比如技术总监. 先贴一张技术人员职业发展路线图, ...

  9. macOS VMWare Fusion报错”找不到可以连接的有效对等进程”的解决方案

    macOS VMWare Fusion报错”找不到可以连接的有效对等进程”的解决方案 我的是macOS 10,默认情况下不允许未知身份的软件安装 默认情况,如下图所示: 解决办法: sudo spct ...

  10. react组件引用时的default常见错误

    1.下面使用方法是正确的: export class StepLoad extends React.Component {} 引用上面插件的方法,重命名 import {StepLoad as Ste ...