中文翻译:

但是,唉!一天,项链被撕破了,珠子散落在屋檐上。我姐姐尽力把地板上的珠子都捡起来了。但她不确定自己是否能收集到所有的照片。现在,她来找我帮忙。她想知道是否有可能让克劳斯使用她在里面的所有珠子,请帮助我写一个程序来解决这个问题。输入这个输入包含t’测试用例。输入的第一行包含整数。bead的数目每个测试用例的第一行包含一个整数n(5<n 1000),因为我妹妹可以收集。接下来的n行中的每一行都包含两个描述珠子颜色的整数。颜色由从1到50的整数表示,对于输入中的每个测试用例,首先输出示例输出中显示的测试用例编号。如果你觉得有些珠子可能会丢失,那就打印出来,这些珠子本身可能会丢失。否则,在每行上打印n行,并使用单珠说明。每个珠在一条线上。否则,在每行上打印n行,并使用单珠说明。每个beadDescription由两个整数组成,给出其两端的颜色。对于1<i<n1,第二行整数i必须与linn上的第一个整数相同,并且必须等于第1行上的第一个整数。由于有许多解决方案,因此其中任何一个都是可接受的,在两个连续的测试用例之间打印一个空白行s25le22356522233示例输出

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");
}
}
}

运行结果:

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

Java实现构造无向图的欧拉回路( The Necklace)的更多相关文章

  1. 算法笔记_143:构造无向图的欧拉回路(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 具体链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Item ...

  2. hdu 1878 无向图的欧拉回路

    原题链接 hdu1878 大致题意: 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个无向图,问是否存在欧拉回路? 思路: 无向图存在欧拉回路的条件:1.图是连 ...

  3. SGU---101 无向图的欧拉回路

    题目链接: https://cn.vjudge.net/problem/SGU-101 题目大意: 给定你n张骨牌,每张牌左右两端有一个数字,每张牌的左右两端数字可以颠倒,找出一种摆放骨牌的顺序,使得 ...

  4. 算法笔记_142:无向图的欧拉回路求解(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 John's trip Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8 ...

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

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

  6. UVA 10054 The Necklace (无向图的欧拉回路)

    本文链接:http://www.cnblogs.com/Ash-ly/p/5405904.html 题意: 妹妹有一条项链,这条项链由许多珠子串在一起组成,珠子是彩色的,两个连续的珠子的交汇点颜色相同 ...

  7. Java实现无向图的欧拉回路判断问题

    1 问题描述 Problem Description 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? Input 测试输入包含若干测试 ...

  8. 如何在 Java 中实现无向图

    基本概念 图的定义 一个图是由点集 \(V=\{v_i\}\) 和 \(V\) 中元素的无序对的一个集合 \(E=\{e_k\}\) 所构成的二元组,记为 \(G=(V,E)\),\(V\) 中的元素 ...

  9. poj2513Colored Sticks(无向图的欧拉回路)

    /* 题意:将两端涂有颜色的木棒连在一起,并且连接处的颜色相同! 思路:将每一个单词看成一个节点,建立节点之间的无向图!判断是否是欧拉回路或者是欧拉路 并查集判通 + 奇度节点个数等于2或者0 */ ...

随机推荐

  1. mysql 库表整体相关查询

    select table_schema,table_name from information_schema.columns where column_name = '字段名'; 查询某张表有几条记录 ...

  2. 聚类算法——DBSCAN算法原理及公式

    聚类的定义 聚类就是对大量未知标注的数据集,按数据的内在相似性将数据集划分为多个类别,使类别内的数据相似度较大而类别间的数据相似度较小.聚类算法是无监督的算法. 常见的相似度计算方法 闵可夫斯基距离M ...

  3. JS函数和对象

    1.函数 isNaN(数据)/parseInt/parseFloat/Number/prompt... 函数分为系统函数和自定义函数 function: 功能体,函数(方法),可以接受若干个数据,返回 ...

  4. Js运算符和逻辑结构

    1.运算符 (1)赋值运算符 =  +=  -=  *=  /=  %= (2)三目运算符 一目  一个运算符连接一个数据   --  ++  ! 二目  一个运算符连接两个数据   + - * / ...

  5. 万字长文!一次性弄懂 Nginx 处理 HTTP 请求的 11 个阶段

    Nginx 处理一个 HTTP 请求的全过程 前面给大家讲了 Nginx 是如何处理 HTTP请求头部的,接下来就到了真正处理 HTTP 请求的阶段了.先看下面这张图,这张图是 Nginx 处理 HT ...

  6. noip2019(普及组) 公交换乘 (不剪枝见祖宗题)

    luogu题目传送门 其实就是一道普普通通的模拟题,但是1e5的数据让很多不看数据范围和不加优化的小伙伴们莫名其妙的T了.(包括我) 因此,论减枝的重要性!! 于是乎,最重要的一点也就出来了.早就过期 ...

  7. BUUCTF WEB-WP(3)

    BUUCTF WEB 几道web做题的记录 [ACTF2020 新生赛]Exec 知识点:exec命令执行 这题最早是在一个叫中学生CTF平台上看到的类似,比这题稍微要复杂一些,多了一些限制(看看大佬 ...

  8. Springboot 内置tomcat 基本配置收集整理

    配置一: server:# tomcat 配置  tomcat:    # 接收队列长度    accept-count: 1000    # 最小空闲线程数    min-spare-threads ...

  9. 【python系统学习16】编码基础知识

    编码 计算机是怎么传输和存储数据的? 就是把人类认识的中英文字.其他国家语言.数字甚至运算符等符号转成二进制的0.1,并进行存储和传输. 编码 人类语言:中英文字.其他国家语言.数字甚至运算符等符号 ...

  10. 关于STL-map容器

    1.使用时加入头文件#include <map>; 2.从前遍历it = map.begin(); it != map.end(); it++ 3.从后遍历it = map.rbegin( ...