AOJ2283 Seishun 18 Kippu

問題リンク Seishun 18 Kippu

  • 解法

ワーシャルフロイドで任意の2駅間の最短移動時間を求め、
S→P + P→G
が答えとなります。

  • ソース
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

//Seishun 18 Kippu
public class AOJ2283 {

	void run(){
		Scanner sc = new Scanner(System.in);
		for(;;){
			int n = sc.nextInt();
			int m = sc.nextInt();
			if((n|m)==0)break;
			Map<String, Integer> ref = new HashMap<String, Integer>();
			int id = 0;
			int s = id; ref.put(sc.next(), id++);
			int p = id; ref.put(sc.next(), id++);
			int g = id; ref.put(sc.next(), id++);
			int[][] e = new int[n][n];
			for(int[]a:e)Arrays.fill(a, 1<<29);
			while(m--!=0){
				String A = sc.next();
				String B = sc.next();
				int a = -1, b = -1;
				if(ref.containsKey(A))a = ref.get(A);
				else {
					a = id; ref.put(A, id++);
				}
				if(ref.containsKey(B))b = ref.get(B);
				else{
					b = id; ref.put(B, id++);
				}
				int d = sc.nextInt(), t = sc.nextInt();
				e[a][b] = e[b][a] = d/40+t;
			}
			for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<n;j++)e[i][j] = Math.min(e[i][j], e[i][k]+e[k][j]);
			System.out.println(e[s][p]+e[p][g]);
		}
	}
	
	public static void main(String[] args) {
		new AOJ2283().run();
	}
}