无需去重边,链式前向星存图,spfa求两点间最短路
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int s = sc.nextInt();
int t = sc.nextInt();
Graph graph = new Graph(n, m);
for (int i = 0; i < m; ++i) {
int u = sc.nextInt();
int v = sc.nextInt();
int w = sc.nextInt();
graph.add(u, v, w);
}
Queue<Integer> que = new LinkedList<>();
if (s != t)
que.add(s);
int[] dis = new int[n+1];
boolean[] vis = new boolean[n+1];
for (int i = 0; i <= n; ++i)
dis[i] = Integer.MAX_VALUE;
dis[s] = 0;
vis[s] = true;
while(!que.isEmpty()) {
int u = que.poll();
vis[u] = false;
for (int i = graph.head[u]; i != -1; i = graph.edge[i].next) {
int v = graph.edge[i].to;
int w = graph.edge[i].weight;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
if (v == t) break;
if (!vis[v]) {
vis[v] = true;
que.add(v);
}
}
}
}
System.out.println(dis[t] == Integer.MAX_VALUE ? -1 : dis[t]);
}
static class Graph {
int[] head;
Edge[] edge;
int tot = 0;
Graph(int n, int m) {
head = new int[n+1];
for (int i = 0; i <= n; ++i)
head[i] = -1;
edge = new Edge[m];
}
void add(int u, int v, int w) {
edge[tot] = new Edge(v, w, head[u]);
head[u] = tot++;
}
class Edge {
int to;
int weight;
int next;
Edge(int t, int w, int n) {
to = t; weight = w; next = n;
}
}
}
}

京公网安备 11010502036488号