Dijkstra+堆優化+Java模板

模板例題:http://oj.hzjingma.com/contest/problem?id=73&pid=9


import java.io.BufferedInputStream;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.HashMap;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Stack;

public class Main {
	private static final int inf = 0x3f3f3f;
			
	static int[] dis,vis;
	static int n,con;
	static int edge;
	static Map<String, Integer> m=new HashMap<String, Integer>();
	static class e{
		int u,v,next,w;
	}static e[] es;
	static void add(int u,int v, int w) {
		if(es[con]==null) es[con]=new e();
		es[con].w=w;es[con].v=v;es[con].next=head[u];head[u]=con++;
	}
	
	static class  p implements Comparable<p>{
		int v;int dis;
		public int compareTo(p o) {
			return this.dis - o.dis;
		}
		public p(int v,int dis) {
			this.v=v;this.dis=dis;
		}
	}
	static PriorityQueue<p> q = new PriorityQueue<p>();
	
	static void Dijikstra(int begin) {
		dis[begin]=0;
		q.add(new p(begin,0));
		while(!q.isEmpty()) {
			p temp=q.poll();
			if(vis[temp.v]==1)continue;
			vis[temp.v]=1;
			for(int i=head[temp.v];i!=-1;i=es[i].next){
				int v=es[i].v;
	
				if(vis[v]==0 && dis[v]>dis[temp.v]+es[i].w) {
					dis[v]=dis[temp.v]+es[i].w;
					q.add(new p(v,dis[v]));
				}
			}
		}
//		System.out.println(dis[1]);
//		System.out.println(dis[2]);
//		System.out.println(dis[3]);
//		System.out.println(dis[4]);
	}
	
	static void init() {
		BigInteger a=new BigInteger("2");
		BigInteger res =new BigInteger("1");
		m.put("1", 0);
		for(int i=1;i<=50;i++) {
			res=res.multiply(a);
			m.put(res.toString(), i);
		}
		q.clear();con=0;
		vis = new int[n+2];
		head=new int[n+5];Arrays.fill(head, -1);
		dis = new int[n+2];  Arrays.fill(dis,  inf);
		es=new e[edge*2+2];
	}
	
	public static void main(String[] args) {
		
		Scanner sc= new Scanner(new BufferedInputStream(System.in));
		  n = sc.nextInt();
		  edge =  sc.nextInt();
		int begin=sc.nextInt();
		int end=sc.nextInt();
		init();
		
		for(int i=0;i<edge;i++) {
			int t1=sc.nextInt();
			int t2=sc.nextInt();
			BigInteger temp = sc.nextBigInteger();
			int t3=m.get(temp.toString());
			add(t1,t2,t3);
		}
		

		Dijikstra(begin);
		BigInteger t=new BigInteger("2");
		if(dis[end]==inf)System.out.println(-1);
		else System.out.println( t.pow(dis[end]));
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章