链式前向星存图
private static int n, m, count = 0;
private static int[] head; // head存储每个节点的第一条边的序号,要初始化为-1
private static long[] dist; // dist存储源点到其他点的最短距离
public static class Edge {
int next; // next表示同一顶点的下一条边
int to; // to表示这条边指向的顶点
long w; // w表示权重
}
private static Edge[] edges; // edges[]存储所有的边
//在顶点u和v之间加一条权重为w的有向边
public static void add(int u, int v, long w) {
edges[count] = new Edge(); // 这一步没有会报错
edges[count].to = v; //指向v
edges[count].w = w; //赋权
edges[count].next = head[u]; //下一条边的编号,相当于头插法
head[u] = count; //更新当前顶点u的第一条边
count += 1; //边的数量加一
}
SPFA(最短路)
public static void SPFA() {
queue.offer(A); //源点A入队
//循环条件:队列不为空
while (!queue.isEmpty()) {
int cur = queue.poll(); //当前节点出队
//遍历当前节点的所有边
for (int i = head[cur]; i != -1; i = edges[i].next) {
int v = edges[i].to;
//如果有需要更新的顶点,且该顶点不在队列中,入队并更新最短距离
if (dist[v] > dist[cur] + edges[i].w) {
dist[v] = dist[cur] + edges[i].w;
if (!queue.contains(v)) {
queue.offer(v);
}
}
}
}
}