AOJ1138 Traveling by Stagecoach

問題リンク Traveling by Stagecoach

  • 解法

最短経路問題です。(町、残っている馬車券)をノードにしたダイクストラで解けます。

  • ソース
import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;

//Traveling by Stagecoach
public class AOJ1138 {

	static double[][] dist;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(true){
			int n = sc.nextInt();
			int m = sc.nextInt();
			int p = sc.nextInt();
			int a = sc.nextInt();
			int b = sc.nextInt();
			if((n|m|p|a|b)==0)break;
			int[] h = new int[n];
			for(int i=0;i<n;i++)h[i]=sc.nextInt();
			int[][] cost = new int[m+1][m+1];
			while(p--!=0){
				int s = sc.nextInt();
				int t = sc.nextInt();
				int d = sc.nextInt();
				cost[s][t] = cost[t][s] = d;
			}
			dist = new double[m+1][1<<n];
			for(double i[]:dist)Arrays.fill(i, Integer.MAX_VALUE);
			PriorityQueue<int[]> q = new PriorityQueue<int[]>(m+1, new Comparator<int[]>() {
				public int compare(int[] o1, int[] o2) {
					return dist[o1[0]][o1[1]]-dist[o2[0]][o2[1]]<0?-1:dist[o1[0]][o1[1]]-dist[o2[0]][o2[1]]>0?1:0;
				}
			});
			dist[a][(1<<n)-1] = 0;
			q.add(new int[]{a, (1<<n)-1});
			while(!q.isEmpty()){
				int[] v = q.poll();
				if(v[0]==b)break;
				for(int j=0;j<n;j++){
					if((v[1]&(1<<j))==0)continue;
					for(int t=1;t<=m;t++){
						if(cost[v[0]][t]==0)continue;
						double w = dist[v[0]][v[1]] + cost[v[0]][t]*1.0/h[j];
						if(w < dist[t][v[1]-(1<<j)]){
							dist[t][v[1]-(1<<j)] = w;
							q.add(new int[]{t, v[1]-(1<<j)});
						}
					}
				}
			}
			double min = Integer.MAX_VALUE;
			for(int i=0;i<1<<n;i++)min=Math.min(min, dist[b][i]);
			System.out.println(min==Integer.MAX_VALUE?"Impossible":min);
		}
	}
}