| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
使用Dijkstra算法的Java代码此代码在[洛谷](https://www.luogu.com.cn/problem/P2865)测试通过,因为POJ使用的JDK为1.5版本,JDK1.5不支持泛型,所以请你自行解决泛型问题,否则编译不通过。
```Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.PriorityQueue;
public class Main {
static int N, R;
static class Edge {
int to, cost;
Edge (int to, int cost) {
this.to = to;
this.cost = cost;
}
}
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer streamTokenizer = new StreamTokenizer(bufferedReader);
streamTokenizer.nextToken();
N = (int)streamTokenizer.nval;
streamTokenizer.nextToken();
R = (int)streamTokenizer.nval;
Map<Integer, List<Edge>> G = new HashMap<Integer, List<Edge>>();
for (int i = 1; i <= N; i++) {
G.put(i, new ArrayList<Edge>());
}
for (int i = 0; i < R; i++) {
streamTokenizer.nextToken();
int from = (int)streamTokenizer.nval;
streamTokenizer.nextToken();
int to = (int)streamTokenizer.nval;
streamTokenizer.nextToken();
int cost = (int)streamTokenizer.nval;
G.get(from).add(new Edge(to, cost));
G.get(to).add(new Edge(from, cost));
}
bufferedReader.close();
System.out.println(solve(G));
}
static int solve(Map<Integer, List<Edge>> G) {
PriorityQueue<Main.Edge> queue = new PriorityQueue<Main.Edge>(new Comparator<Main.Edge>(){
public int compare(Edge o1, Edge o2) {
return o1.cost < o2.cost ? -1 : 1;
}
});
int[] costs = new int[N + 1];
int[] costs2 = new int[N + 1];
Arrays.fill(costs, Integer.MAX_VALUE);
Arrays.fill(costs2, Integer.MAX_VALUE);
costs[1] = 0;
queue.add(new Edge(1, 0));
while (!queue.isEmpty()) {
Edge node = queue.poll();
int v = node.to;
int cost = node.cost;
if (costs2[v] < cost) {
continue;
}
for (Edge edge : G.get(v)) {
int new_cost = cost + edge.cost;
if (new_cost < costs[edge.to]) {
int temp = costs[edge.to];
costs[edge.to] = new_cost;
new_cost = temp;
queue.add(new Edge(edge.to, costs[edge.to]));
}
if (new_cost < costs2[edge.to] && new_cost > costs[edge.to]) {
costs2[edge.to] = new_cost;
queue.add(new Edge(edge.to, costs2[edge.to]));
}
}
}
return costs2[N];
}
}
```
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator