HDU2066最短路
2015-07-12 14:59
441 查看
import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.LinkedList; import java.util.PriorityQueue; import java.util.Queue; import java.util.Scanner; import java.util.Stack; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException{ StreamTokenizer cin = new StreamTokenizer(new BufferedInputStream(System.in)); InputReader in = new InputReader(System.in) ; PrintWriter out = new PrintWriter(System.out) ; while(cin.nextToken() != cin.TT_EOF){ new Task().solve(cin, out) ; } out.flush() ; } } class Task{ static class E{ int v ; int w ; public E(int v , int w){ this.v = v ; this.w = w ; } } int T , S , D ; ArrayList<E> adj[] ; boolean[] isEnd ; int dist[] ; public void solve(StreamTokenizer cin , PrintWriter out) throws IOException{ T = (int)cin.nval ; cin.nextToken() ; S = (int)cin.nval ; cin.nextToken() ; D = (int)cin.nval ; adj = new ArrayList[1001] ; for(int i = 1 ; i<= 1000 ; i++) adj[i] = new ArrayList<Task.E>() ; for(int i = 0 ; i < T ; i++){ cin.nextToken() ; int u = (int)cin.nval ; cin.nextToken() ; int v = (int)cin.nval ; cin.nextToken() ; int w = (int)cin.nval ; adj[u].add(new E(v, w)) ; adj[v].add(new E(u, w)) ; } PriorityQueue<E> que = new PriorityQueue<E>(11 , new Comparator<E>(){ public int compare(E a , E b){ return a.w - b.w ; } } ) ; dist = new int[1001] ; Arrays.fill(dist, Integer.MAX_VALUE) ; for(int i = 0 ; i < S ; i++){ cin.nextToken() ; int u = (int)cin.nval ; que.add(new E(u, 0)) ; dist[u] = 0 ; } isEnd = new boolean[1001] ; Arrays.fill(isEnd, false) ; for(int i = 0 ; i < D ; i++){ cin.nextToken() ; int u = (int)cin.nval ; isEnd[u] = true ; } int ans = Integer.MAX_VALUE ; while(! que.isEmpty()){ E e = que.poll() ; if(isEnd[e.v]) ans = Math.min(ans, e.w) ; for(E i : adj[e.v]){ if(e.w + i.w < dist[i.v]){ dist[i.v] = e.w + i.w ; que.add(new E(i.v, dist[i.v])) ; } } } out.println(ans); } } class InputReader{ public BufferedReader reader; public StringTokenizer tokenizer; public InputReader(InputStream stream){ reader = new BufferedReader(new InputStreamReader(stream), 32768); tokenizer = null; } public String next(){ while(tokenizer == null || !tokenizer.hasMoreTokens()){ try{ tokenizer = new StringTokenizer(reader.readLine()); }catch (IOException e) { throw new RuntimeException(e); } } return tokenizer.nextToken(); } public int nextInt() { return Integer.parseInt(next()); } }
相关文章推荐
- BFS宽度优先搜索算法
- 练声
- Linux多线程编程及线程同步方法总结
- Windows Azure 系列-- Azure Redis Cache的配置和使用
- Remove Nth Node From End of List
- [CentOS 7] 安装nginx
- C++中一个类究竟占用多少内存
- 初探canvas
- OpenFileDialog的用法
- ionic返回键双击退出
- Android当中用到的Log和Toast
- 改变XCode的默认设置
- 写代码质量改善java计划151建议——导航开始
- 根据汉语字符串获得对应的拼音字符串或者拼音首字母字符串等操作
- 深度学习之一:概述
- 1001 Exponentiation
- Delphi的in循环
- 【LeetCode 234】Palindrome Linked List
- 光源
- 使用service方式启动rabbitmq-server报错erlexec: HOME must be set