poj2387 Til the Cows Come Home—Dijkstra模板

怀着激动的心情,弱渣来发表第一篇解题报告。

WA了一下午,整个人都不好了,查了不少解题报告,都说本题要注意重边问题,但是采用邻接表的Dijkstra不需要关注这个啊。。。

最后才发现原来Input先给出的是边数,然后才是顶点数,简直是神坑啊!

Dijkstra用邻接表来实现复杂度为O(|E|log|V|),要优于邻接矩阵,所以建议此题用邻接表来实现。


百度的翻译太糟糕了,我就不粘了。。。


import java.util.*;
public class Main {
	public static class Pair implements Comparable<Pair>
	{
		int v,w;
		Pair(int v,int weight)
		{
			this.v=v;w=weight;
		}
		public int compareTo(Pair x) {
			return this.w-x.w;
		}
	}

	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		int t=in.nextInt(),n=in.nextInt();
		ArrayList<Pair>[] path=new ArrayList[n+1];
		int[] d=new int[n+1];
		for(int i=1;i<=n;i++)
		{
			path[i]=new ArrayList<Pair>();
			d[i]=-1;
		}
		for(int i=0;i<t;i++)
		{
			int a=in.nextInt(),b=in.nextInt(),
				c=in.nextInt();
			path[a].add(new Pair(b,c));
			path[b].add(new Pair(a,c));
		}
		Queue<Pair> q=new PriorityQueue<Pair>();
		d[1]=0;q.add(new Pair(1,0));
		while(!q.isEmpty())
		{
			Pair a=q.poll();
			while(!q.isEmpty()&&a.w>d[a.v])
				a=q.poll();
			for(int i=0;i<path[a.v].size();i++)
			{
				Pair b=path[a.v].get(i);
				if(d[b.v]==-1||d[b.v]>d[a.v]+b.w)
				{
					d[b.v]=d[a.v]+b.w;
					q.add(new Pair(b.v,d[b.v]));
				}
			}
		}
		System.out.println(d[n]);
	}
}


阅读更多
博主设置当前文章不允许评论。
相关热词

博主推荐

换一批

没有更多推荐了,返回首页