HDU 1874 畅通工程续

来源:互联网 发布:淘宝店导航栏css代码 编辑:程序博客网 时间:2024/04/29 17:58

 

畅通工程续  

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 13836    Accepted Submission(s): 4695

Problem Description
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。

现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
Input
本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。
Output
对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
Sample Input 
3 30 1 10 2 31 2 10 23 10 1 11 2
Sample Output
2-1

 

package hdu;import java.util.ArrayDeque;import java.util.Arrays;import java.util.Queue;import java.util.Scanner;/** * @description   HDU 1874 畅通工程续 * @techniqueBellman_Ford 算法 * @date20120813 * @time14:07 * @version1.0  * @author Alex * */public class Hdu1874_20120813_1 {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n,m,a,b,x, start,end;int[][] map;while(in.hasNextInt()){n = in.nextInt();m = in.nextInt();map = new int[n][n];initMap(map);while(m-->0){a = in.nextInt();b = in.nextInt();x = in.nextInt();if(map[a][b]>x){map[a][b] = x;map[b][a] = x;}}start = in.nextInt();end = in.nextInt();if(start == end){System.out.println(0);}else{ShortstPath(map,start,end);}}}private static void ShortstPath(int [][] map, int s, int v){int n = map.length, i, j;long [] d = new long[n];Queue<Integer> queue = new ArrayDeque<Integer>();Arrays.fill(d, Long.MAX_VALUE);d[s] = 0;queue.add(s);boolean [] tag = new boolean[n];Arrays.fill(tag, true);while(!queue.isEmpty()){i = queue.poll();tag[i] = true;for(j = 0; j < n; ++j){if(tag[j]&& map[i][j] != Integer.MAX_VALUE && d[j] > d[i] + map[i][j]){d[j] = d[i] + map[i][j];if(!queue.contains(j))queue.add(j);}}}if(d[v] < Long.MAX_VALUE){System.out.println(d[v]);}else{System.out.println(-1);}}private static void initMap(int [][] map){int i, len = map.length;for(i = 0; i < len; ++i){Arrays.fill(map[i], Integer.MAX_VALUE);}}}

原创粉丝点击