AOJ2005 Water Pipe Construction
問題リンク Water Pipe Construction
- 解法
全点間の最短距離をワーシャルフロイドで求めます。
次に基地kを選び、wf[s][k]+wf[k][g1]+wf[k][g2]が最小となるkを探します。このkはs, g1, g2になっても何ら構わないです。
- ソース
import java.util.Arrays; import java.util.Scanner; //Water Pipe Construction public class AOJ2005 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(true){ int n = sc.nextInt(); int m = sc.nextInt(); int s = sc.nextInt(); int g1 = sc.nextInt(); int g2 = sc.nextInt(); if(n==0)break; int[][] cost = new int[n+1][n+1]; for(int[]c:cost)Arrays.fill(c, Integer.MAX_VALUE); while(m--!=0){ int a = sc.nextInt(); int b = sc.nextInt(); cost[a][b]=sc.nextInt(); } int[][] wf = new int[n+1][n+1]; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) wf[i][j] = cost[i][j]; for(int i=1;i<=n;i++)wf[i][i]=0; for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(wf[i][k]!=Integer.MAX_VALUE && wf[k][j]!=Integer.MAX_VALUE) wf[i][j] = Math.min(wf[i][j], wf[i][k]+wf[k][j]); } } } int min = Integer.MAX_VALUE; for(int k=1;k<=n;k++){ if(wf[s][k]!=Integer.MAX_VALUE && wf[k][g1]!=Integer.MAX_VALUE && wf[k][g2]!=Integer.MAX_VALUE){ min = Math.min(min, wf[s][k]+wf[k][g1]+wf[k][g2]); } } System.out.println(min); } } }