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


原创粉丝点击