POJ 2387 - Til the Cows Come Home - Dijkstra

 

Til the Cows Come Home

描述
贝茜在地里,想在农夫约翰叫醒她准备早上挤奶之前,回到谷仓里尽可能多地睡一觉。贝西需要睡美容觉,所以她想尽快回来。
农夫约翰的田地里有N个地标(2<=N<=1000),唯一编号为1..N。地标1是谷仓;贝茜整天站着的苹果树林是N。
奶牛在田野中行走,在地标之间使用不同长度的T(1<=T<=2000)双向奶牛步道。
贝西对自己的导航能力没有信心,所以一旦启动它,她总是从头到尾保持跟踪。
考虑到路标之间的小路,确定贝西返回谷仓必须走的最小距离。可以保证存在这样的路径。

输入
第1行:两个整数:T和N
行2..T+1:每行用三个空格分隔的整数来描述一个轨迹。前两个整数是轨迹所经过的地标。第三个整数是轨迹的长度,范围为1..100。

输出
第1行:一个整数,贝西从地标N到地标1的最小距离。

Sample Input
5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100

Sample Output
90

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

/**
 * 
 *
 *思路:迪杰斯特拉
 * @author XA-GDD
 *
 */
public class C_TilTheCowsComeHome {

	static int T,N;
	static ArrayList<ArrayList<int[]>> adjList = new ArrayList<ArrayList<int[]>>();
	static int [] minDist;
	static boolean [] visited;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str;  
        StringTokenizer st;
		while((str = br.readLine()) != null) {
			if("".equals(str)) break;
			st = new StringTokenizer(str);
			T = Integer.parseInt(st.nextToken());
			N = Integer.parseInt(st.nextToken());
			
			adjList.clear();
			minDist = new int[N+2];
			visited = new boolean[N+2];
			for(int i=0;i<=N;i++) {
				adjList.add(new ArrayList<int[]>());
			}
			for(int i=0;i<T;i++) {
				st = new StringTokenizer(br.readLine());
				int s = Integer.parseInt(st.nextToken());
				int e = Integer.parseInt(st.nextToken());
				int dist = Integer.parseInt(st.nextToken());
				adjList.get(s).add(new int[] {e,dist});
				adjList.get(e).add(new int[] {s,dist});	
			}
			
			dijkstra(N);
			System.out.println(minDist[1]);
		}	

	}
	
static void dijkstra(int start) {
	PriorityQueue<int []> pq = new PriorityQueue<int[]>(11,new Comparator<int[]>() {
		@Override
		public int compare(int[] o1, int[] o2) {
			return o1[1]-o2[1];
		}
	});
	
	Arrays.fill(minDist, Integer.MAX_VALUE);
	
	pq.add(new int[] {start,0});
	minDist[start]=0;
	
	while(!pq.isEmpty()) {
		int [] curr = pq.poll();
		if(visited[curr[0]]) {
			continue;
		}
		visited[curr[0]]=true;
		for(int i=0;i<adjList.get(curr[0]).size();i++) {
			int next[] = adjList.get(curr[0]).get(i).clone();
			if(minDist[next[0]]>minDist[curr[0]]+next[1]) {
				next[1] += minDist[curr[0]];
				minDist[next[0]] = minDist[curr[0]]+next[1];
				pq.add(new int[] {next[0],minDist[next[0]]});
			}
		}
	}
}

}

  

上一篇:路径规划的算法题


下一篇:[C] Dijkstra算法——通过边实现松弛