参照单源最短路径 /** * 文件名:Main.java * * 版本信息: * 日期:2013-6-27 * Copyright Corporation 2013 * 版权全部 * */ package 题目1008; import java.util.Scanner; /** * * 项目名称:arithmetic * 类名称:Main * 类描述: * 建立人:黄传聪 * 建立时间:2013-6-27 下午3:51:03 * 修改人:黄传聪 * 修改时间:2013-6-27 下午3:51:03 * 修改备注:基本思路:创建两个二维数组,一组存储点到点之间的距离,另外一组存储点到点之间的花费 * 单元最短路径为贪心策略 * @version * */ public class Main { public static void main(String[] args) { int n; //the point num int m; // the line count Scanner scanner = new Scanner(System.in); while(scanner.hasNext()){ n = scanner.nextInt(); m = scanner.nextInt(); if(n == 0 && m ==0 ){ break; } // 建立两个二维数组 int[][] length = new int[n+1][n+1]; int[][] value = new int[n+1][n+1]; int i,j; // 将数组的元素置为0表示不可达,注意,自身到自身设置为不可到达 for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ length[i][j] = 0; value[i][j] = 0; } } for(i=0;i<m;i++){ int a = scanner.nextInt(); int b = scanner.nextInt(); int c = scanner.nextInt(); int d = scanner.nextInt(); length[a][b] = c; value[a][b] = d; } /*for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ System.out.print( " " + legth[i][j] ); } System.out.println(); }*/ int min = 999999999; int begin = scanner.nextInt(); int end = scanner.nextInt(); int[]result = new int[n+1]; //用于存放动态规划的最小路劲 for(i=0;i<n+1;i++){ result[i] = 0; } int k = 0; if(length[begin][end] != 0){ min = length[begin][end]; } for(i=begin;i<=end;i++){ for(j=1;j<=end;j++){ if(length[i][j] != 0 && length[i][j] < min){ result[k] = j; } } k++; } int valueCount = 0; int lengthCount = 0; for(k=0;k<result.length;k++){ if(result[k] == 0){ break; }else{ lengthCount += length[begin][result[k]]; valueCount += value[begin][result[k]]; begin = result[k]; } } System.out.println(lengthCount + " " + valueCount); } } }