2013编程之美资格赛之树上的三角形(Java实现)
2023-09-11 14:21:18 时间
描述
有一棵树,树上有只毛毛虫。它在这棵树上生活了很久,对它的构造了如指掌。所以它在树上从来都是走最短路,不会绕路。它还还特别喜欢三角形,所以当它在树上爬来爬去的时候总会在想,如果把刚才爬过的那几根树枝/树干锯下来,能不能从中选三根出来拼成一个三角形呢?
输入
输入数据的第一行包含一个整数 T,表示数据组数。
接下来有 T 组数据,每组数据中:
第一行包含一个整数 N,表示树上节点的个数(从 1 到 N 标号)。
接下来的 N-1 行包含三个整数 a, b, len,表示有一根长度为 len 的树枝/树干在节点 a 和节点 b 之间。
接下来一行包含一个整数 M,表示询问数。
接下来M行每行两个整数 S, T,表示毛毛虫从 S 爬行到了 T,询问这段路程中的树枝/树干是否能拼成三角形。
输出
对于每组数据,先输出一行"Case #X:",其中X为数据组数编号,从 1 开始。
接下来对于每个询问输出一行,包含"Yes"或“No”,表示是否可以拼成三角形。
数据范围
1 ≤ T ≤ 5
小数据:1 ≤ N ≤ 100, 1 ≤ M ≤ 100, 1 ≤ len ≤ 10000
大数据:1 ≤ N ≤ 100000, 1 ≤ M ≤ 100000, 1 ≤ len ≤ 1000000000
样例输入
2
5
1 2 5
1 3 20
2 4 30
4 5 15
2
3 4
3 5
5
1 4 32
2 3 100
3 5 45
4 5 60
2
1 4
1 3
样例输出
Case #1:
No
Yes
Case #2:
No
Yes
主要算法:
define results
get T
for 1 to T
get N
for 1 to N-1
get 边
getStruct 边s //构造类树
get M
define result
for 1 to M
get S,E
get S,E 到树根的路劲
get S,E 到树根的路劲的非公共节点
get S,E 间的路劲
get values S,E间路劲的段长度集合
sort(values)
result+=Test values//测试是否为三角形
results add result
print results
Test 算法
for i=2 to values.length
if values[i-2]+vaules[i-1] values[i]
return true
return false
Java实现图书管理系统 本篇文章是对目前Java专栏已有内容的一个总结练习,希望各位小主们在学习完面向对象的知识后,可以阅览本篇文章后,自己也动手实现一个这样的demo来加深总结应用已经学到知识并进行巩固。
Java实现拼图小游戏(1)—— JFrame的认识及界面搭建 如果要在某一个界面里面添加功能的话,都在一个类中,会显得代码难以阅读,而且修改起来也会很困难,所以我们将游戏主界面、登录界面、以及注册界面都单独编成一个类,每一个类都继承JFrame父类,并且在类中创建方法来来实现页面
Java实现拼图小游戏(7)—— 计步功能及菜单业务的实现 注意由于我们计步功能的步数要在重写方法中用到,所以不能将初始化语句写在方法体内,而是要写在成员位置。在其名字的时候也要做到“见名知意”,所以我们给它起名字为step
Java实现拼图小游戏(7)—— 作弊码和判断胜利 当我们好不容易把拼图复原了,但是一点提示也没有,完全看不出来是成功了,那么我们就需要有判断胜利的功能去弹出“成功”类的图片,以便于玩家选择是重新开始还是退出小游戏
有一棵树,树上有只毛毛虫。它在这棵树上生活了很久,对它的构造了如指掌。所以它在树上从来都是走最短路,不会绕路。它还还特别喜欢三角形,所以当它在树上爬来爬去的时候总会在想,如果把刚才爬过的那几根树枝/树干锯下来,能不能从中选三根出来拼成一个三角形呢?
输入
输入数据的第一行包含一个整数 T,表示数据组数。
接下来有 T 组数据,每组数据中:
第一行包含一个整数 N,表示树上节点的个数(从 1 到 N 标号)。
接下来的 N-1 行包含三个整数 a, b, len,表示有一根长度为 len 的树枝/树干在节点 a 和节点 b 之间。
接下来一行包含一个整数 M,表示询问数。
接下来M行每行两个整数 S, T,表示毛毛虫从 S 爬行到了 T,询问这段路程中的树枝/树干是否能拼成三角形。
输出
对于每组数据,先输出一行"Case #X:",其中X为数据组数编号,从 1 开始。
接下来对于每个询问输出一行,包含"Yes"或“No”,表示是否可以拼成三角形。
数据范围
1 ≤ T ≤ 5
小数据:1 ≤ N ≤ 100, 1 ≤ M ≤ 100, 1 ≤ len ≤ 10000
大数据:1 ≤ N ≤ 100000, 1 ≤ M ≤ 100000, 1 ≤ len ≤ 1000000000
样例输入
2
5
1 2 5
1 3 20
2 4 30
4 5 15
2
3 4
3 5
5
1 4 32
2 3 100
3 5 45
4 5 60
2
1 4
1 3
样例输出
Case #1:
No
Yes
Case #2:
No
Yes
主要算法:
define results
get T
for 1 to T
get N
for 1 to N-1
get 边
getStruct 边s //构造类树
get M
define result
for 1 to M
get S,E
get S,E 到树根的路劲
get S,E 到树根的路劲的非公共节点
get S,E 间的路劲
get values S,E间路劲的段长度集合
sort(values)
result+=Test values//测试是否为三角形
results add result
print results
Test 算法
for i=2 to values.length
if values[i-2]+vaules[i-1] values[i]
return true
return false
程序:
import java.util.*; public class Main { public static void main(String[] args){ Scanner sc=new Scanner(System.in); int T=sc.nextInt(); String[] results=new String[T]; for(int i=0;i i++){ int N=sc.nextInt(); int tempN=N-1; int[][] nodes=new int[tempN][3]; for(int j=0;j tempN;j++){ nodes[j][0]=sc.nextInt(); nodes[j][1]=sc.nextInt(); nodes[j][2]=sc.nextInt(); List ArrayList Integer struct=getStruct(nodes); int M=sc.nextInt(); String result=""; for(int j=0;j j++){ int start=sc.nextInt(); int end=sc.nextInt(); result=result+" "+getResult(start,end,struct,nodes); results[i]=result.trim(); printResult(results); private static List ArrayList Integer getStruct(int[][] nodes) { ArrayList Integer num01s=new ArrayList Integer (nodes.length); int[] temp=new int[nodes.length+1]; for(int i=0;i temp.length;i++){ temp[i]=0; for(int i=0;i nodes.length;i++){ temp[(nodes[i][0]-1)]++; temp[(nodes[i][1]-1)]++; for(int i=0;i temp.length;i++){ if(temp[i]==1) num01s.add(i+1); int structLength=num01s.size()-1; List ArrayList Integer struct=new ArrayList ArrayList Integer (structLength); boolean[] flags=new boolean[structLength+1]; for(int i=0;i flags.length;i++){ flags[i]=true; List Integer success=new ArrayList Integer (nodes.length+1); for(int i=0;i structLength;i++){ ArrayList Integer list=new ArrayList Integer (nodes.length+1); for(int j=0;j flags.length;j++){ if(flags[j]){ flags[j]=false; list.add(num01s.get(j)); success.add(num01s.get(j)); break; int node=list.get(0); boolean flag=true; while(flag){ for(int k=0;k nodes.length;k++){ if((node==nodes[k][0]) (!success.contains(nodes[k][1]))){ list.add(nodes[k][1]); node=nodes[k][1]; success.add(node); break; }else if((node==nodes[k][1]) (!success.contains(nodes[k][0]))){ list.add(nodes[k][0]); node=nodes[k][0]; success.add(node); break; if(i!=0){ int add=list.get(list.size()-1); for(int suc:success){ for(int j=0;j nodes.length;j++){ if((suc==nodes[j][0] add==nodes[j][1])||(suc==nodes[j][1] add==nodes[j][0])){ if(!list.contains(suc)){ list.add(suc); flag=false; list=swap(list); break; if(num01s.contains(node)){ flags[num01s.indexOf(node)]=false; flag=false; struct.add(list); return struct;
private static ArrayList Integer swap(ArrayList Integer list) { ArrayList Integer temp=new ArrayList Integer (list.size()); for(int i=list.size()-1;i i--){ temp.add(list.get(i)); return temp; private static String getResult(int start, int end, List ArrayList Integer struct, int[][] nodes) { ArrayList Integer startPath=getNodePath(start,struct); ArrayList Integer endPath=getNodePath(end,struct); ArrayList Integer SE=new ArrayList Integer (nodes.length+1); int common=getCommonNode(startPath,endPath); if(startPath.indexOf(common)==0){ SE=getPath(common,endPath); }else if( endPath.indexOf(common)==0){ SE=getPath(common,startPath); }else { SE=getPath(common,startPath,endPath); int[] values=getValue(SE,nodes); sort(values); return echo(values); private static ArrayList Integer getPath(int common, ArrayList Integer list) { ArrayList Integer l=new ArrayList Integer (list.size()); int n=list.indexOf(common); for(int i=0;i i++){ l.add(list.get(i)); return l; private static void sort(int[] values) { for(int i=0;i values.length;i++){ int min=i; for(int j=i+1;j values.length;j++){ if(values[j] values[min]) min=j; if(i!=min){ int temp=values[i]; values[i]=values[min]; values[min]=temp; private static String echo(int[] values) { if(values.length 3) return "No"; String result="No"; for(int i=2;i values.length;i++){ if(judge(values[i-2],values[i-1],values[i])){ result="Yes"; break; return result; private static boolean judge(int i, int j, int k) { return ((i+j) private static int[] getValue(ArrayList Integer sE,int[][] nodes) { int[] values=new int[sE.size()-1]; for(int i=0;i values.length;i++){ for(int j=0;j nodes.length;j++){ int x=sE.get(i); int y=sE.get(i+1); if(nodes[j][0]==x nodes[j][1]==y){ values[i]=nodes[j][2]; break; }else if (nodes[j][1]==x nodes[j][0]==y){ values[i]=nodes[j][2]; break; return values; private static ArrayList Integer getPath(int m, ArrayList Integer xList, ArrayList Integer yList) { ArrayList Integer path=new ArrayList Integer (xList.size()+yList.size()); int xindex=xList.indexOf(m); int yindex=yList.indexOf(m); for(int i=0;i xindex;i++){ path.add(xList.get(i)); for(int i=yindex;i i--){ path.add(yList.get(i)); return path; private static int getCommonNode(ArrayList Integer xList, ArrayList Integer yList) { int max=xList.size(); int c=-1; for(int i=0;i i++){ int temp=xList.get(i); if(yList.contains(temp)){ c=temp; break; return c; private static ArrayList Integer getNodePath(int start, List ArrayList Integer struct) { ArrayList Integer temp=new ArrayList Integer temp.add(start); int s=start; int head=struct.get(0).get(0); int slength=struct.size(); boolean flag=true; while(flag){ for(int i=0;i slength;i++){ if(struct.get(i).contains(s) s!=struct.get(i).get(0)){ int x=struct.get(i).indexOf(s); for(int j=(x-1);j j--){ temp.add(struct.get(i).get(j)); s=struct.get(i).get(0); break; if(head==s){ flag=false; return temp; private static void printResult(String[] result) { for(int i=0;i result.length;i++){ System.out.println("Case #"+(i+1)+":"); String[] words=result[i].split(" "); for(String word:words) System.out.println(word); }
这也是同样了,通过了比赛系统小数据测试,大数据测试未知。
——20130408
PS:
今天早晨数据出来了,这道题的大数据测试时TLE,超时。在情理之中。原因见博文《2013编程之美资格赛之大数据测试(Java实现)》
——20130409
Java实现图书管理系统 本篇文章是对目前Java专栏已有内容的一个总结练习,希望各位小主们在学习完面向对象的知识后,可以阅览本篇文章后,自己也动手实现一个这样的demo来加深总结应用已经学到知识并进行巩固。
Java实现拼图小游戏(1)—— JFrame的认识及界面搭建 如果要在某一个界面里面添加功能的话,都在一个类中,会显得代码难以阅读,而且修改起来也会很困难,所以我们将游戏主界面、登录界面、以及注册界面都单独编成一个类,每一个类都继承JFrame父类,并且在类中创建方法来来实现页面
Java实现拼图小游戏(7)—— 计步功能及菜单业务的实现 注意由于我们计步功能的步数要在重写方法中用到,所以不能将初始化语句写在方法体内,而是要写在成员位置。在其名字的时候也要做到“见名知意”,所以我们给它起名字为step
Java实现拼图小游戏(7)—— 作弊码和判断胜利 当我们好不容易把拼图复原了,但是一点提示也没有,完全看不出来是成功了,那么我们就需要有判断胜利的功能去弹出“成功”类的图片,以便于玩家选择是重新开始还是退出小游戏
相关文章
- java基础知识汇总4
- 再谈用java实现Smtp发送邮件之Socket编程
- java高级用法之:在JNA中将本地方法映射到JAVA代码中
- Java判断数据类型及方法是否相同
- 并发编程--JAVA线程池实现讲解及使用示例
- Java并发JUC(java.util.concurrent)JMM内存模型
- 【Java】java数据库连接池配置的几种方法
- 【Java】【异常排查】java.lang.NoClassDefFoundError 完美解决
- Java FutureTask<V> 源码分析 Android上的实现
- 【Java】Eclipse如何创建java项目并运行
- 《Java遗传算法编程》—— 1.2 生物学类比
- 《Java遗传算法编程》—— 2.4 基本实现
- 《Java 2D游戏编程入门》—— 第2章 输入
- JSON类库Jackson优雅序列化Java枚举类
- Java_并发工具包 java.util.concurrent 用户指南(转)
- 【JAVA】【NIO】10、Java NIO ServerSocketChannel
- JAVA实现HTTPserver端
- Java网络编程——TCP图片上传
- 2013编程之美资格赛之长方形(Java实现)
- Java 编程的动态性 第1 部分: 类和类装入--转载
- Java小白入门200例09之检查数字是正数还是负数
- 什么是Java序列化,如何实现java序列化
- 【Java 并发编程】一文读懂线程、协程、守护线程