AOJ0200 Traveling Alone: One-way Ticket of Youth
問題リンク Traveling Alone: One-way Ticket of Youth
- 解法
時間について、金額について、2点間の最小コストが欲しいので、それぞれについてワーシャル・フロイド法を適用します。
- ソース
import java.util.Arrays; import java.util.Scanner; //Traveling Alone: One-way Ticket of Youth public class AOJ0200 { public static int n; public static int m; public static int[][] cost; public static int[][] time; public static int[] dist; public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(true){ n = sc.nextInt(); m = sc.nextInt(); if(n==0&&m==0)break; cost = new int[m][m]; time = new int[m][m]; dist = new int[m]; int[][] dcost = new int[m][m]; int[][] dtime = new int[m][m]; for(int[] a:cost)Arrays.fill(a, Integer.MAX_VALUE); for(int[] a:time)Arrays.fill(a, Integer.MAX_VALUE); for(int[] a:dcost)Arrays.fill(a, 1000000); for(int[] a:dtime)Arrays.fill(a, 1000000); for(int i=0;i<m;i++)dcost[i][i]=dtime[i][i]=0; while(n--!=0){ int a = sc.nextInt()-1; int b = sc.nextInt()-1; int c = sc.nextInt(); int t = sc.nextInt(); cost[a][b] = cost[b][a] = c; dcost[a][b] = dcost[b][a] = Math.min(dcost[a][b], c); time[a][b] = time[b][a] = t; dtime[a][b] = dtime[b][a] = Math.min(dtime[a][b], t); } for(int k=0;k<m;k++){ for(int i=0;i<m;i++){ for(int j=0;j<m;j++){ dcost[i][j] = Math.min(dcost[i][j], dcost[i][k]+dcost[k][j]); dtime[i][j] = Math.min(dtime[i][j], dtime[i][k]+dtime[k][j]); } } } int k = sc.nextInt(); while(k--!=0){ int s = sc.nextInt()-1; int t = sc.nextInt()-1; int x = sc.nextInt(); System.out.println(x==0?dcost[s][t]:dtime[s][t]); } } } }