csp ccf 2017 3修地铁问题
来源:互联网 发布:c语言头文件下载 编辑:程序博客网 时间:2024/04/28 10:10
用java实现,主要是dfs的思想,shortestDay递归结束条件,如果当前节点是终点节点,那么结束递归,并将该条路径所需的最大天数加入到list集合中,或者当前节点再也没有出度的边,也结束递归,函数shortestDay中day参数就是保存一个路径的所需的最大天数,需要不断更新它
package csp1703认证;import java.util.ArrayList;import java.util.List;import java.util.Scanner;public class 修路 {public static class buildRoad{private int[][] edges;private int vertexNum;private int startVertex; //修建的起点private int endVertex; //修建的终点public buildRoad(int vertexNum,int[][] edges,int startVertex,int endVertex) {this.vertexNum = vertexNum;this.edges = edges;this.startVertex = startVertex;this.endVertex = endVertex;}public int shortestDay(int vertex,int day,List<Integer> days) {//传入的参数全部以下标为准如果起点是1,那么下标是0if(vertex==this.endVertex) { //递归退栈的条件days.add(day);return 0;} else {int count = 0;int last = day; //这里就是问题的根源for(int i =0;i<vertexNum;i++) {if(i!=vertex&&edges[vertex][i]!=0) {//循环中的每一次都可能包含一个可行的路径到达终点,应该把当前两个枢纽的天数和上一端隧道的天数比较也就是和last比较,之前我是直接和day比较的,因为之前的循环会覆盖day,,也就是比较错了,不应该拿别的路径来比较天数day = edges[vertex][i]>last?edges[vertex][i]:last; shortestDay(i, day,days);count++;}}if(count==0) {//到了一个枢纽不再有与下一个枢纽相连的路径,但是该枢纽不是终点,那么说明通过这条路无法到达终点return 0;}}return 0;}public int start() {int min = Integer.MAX_VALUE;List<Integer> days = new ArrayList<>();shortestDay(startVertex, Integer.MIN_VALUE, days);System.out.println("路径有:"+days.size());System.out.println("每条路径的最长天数:");for(int i =0;i<days.size();i++) {min = days.get(i)>0&&days.get(i) < min?days.get(i):min;System.out.print(days.get(i)+","); }return min;}}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt(); //枢纽点的个数int m = scanner.nextInt();// 两个枢纽点之间有路径的那些边int[][] edges = new int[n][n];for(int i=0;i<m;i++) {int v1 = scanner.nextInt(); //某个枢纽int v2 = scanner.nextInt();//某个枢纽edges[v1-1][v2-1] = scanner.nextInt(); //两个枢纽之间的天数}int startVertex = 0;int endVertex = n-1;buildRoad bRoad = new buildRoad(n, edges, startVertex, endVertex);int minDay = bRoad.start();System.out.println("\n最少天数为"+minDay+"天");}}
阅读全文
0 0
- csp ccf 2017 3修地铁问题
- CCF CSP 地铁修建
- ccf csp 地铁修建
- CCF-CSP-2017-3-4 地铁修建(结构体优先队列)
- CCF CSP 2017年3月第4题 地铁修建(Kruskal算法)
- CCF-CSP 地铁修建 JAVA 201703-4
- csp/ccf 钥匙问题
- 2017 第11次CCF-CSP认证 地铁修建-并查集
- CCF修地铁
- CCF-CSP-2017-3-1 分蛋糕
- CCF-CSP-2017-3-2 学生排队
- ccf csp 第十次题解 4. 地铁修建
- 地铁修建——CCF CSP 201703-4
- CCF CSP 第十次 第四题 地铁修建 JAVA版
- CCF CSP 地铁修建 最小生成树+并查集
- ccf-csp之地铁修建(最小堆dijkstra算法)
- CCF CSP 编译错误问题
- CCF 2017 03 04修地铁(dijkstra变形)
- C++中基类的析构函数为什么要用virtual虚析构函数
- Signals and Linear Systems
- 总结操作
- UVA
- 标准sql having 别名问题
- csp ccf 2017 3修地铁问题
- iPhoneX适配之UI设计、交互设计
- windows下PS安装教程
- 字体信息设置界面
- Docker入门
- 变态跳台阶
- 简单爬虫知识
- 将博客从CSDN搬至博客园
- spring aop(记录)