參照單源最短路徑 /** * 文件名: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); } } }