单源最短路问题有权图(Dijkstra算法)
Description
给一个n(1 ≤ n ≤ 2500) 个点 m(1 ≤ m ≤ 6200) 条边的无向图,求 s 到 t 的最短路。
Input
第一行四个由空格隔开的整数 n、m、s、t。
之后的 m 行,每行三个正整数 si、ti、wi(1≤wi≤109),表示一条从si 到 ti 长度为 wi 的边。
Output
一个整数,表示从s 到t 的最短路径长度。数据保证至少存在一条道路。
Sample Input
7 11 5 4
2 4 2
1 4 3
7 2 2
3 4 3
5 7 5
7 3 3
6 1 1
6 3 4
2 4 3
5 6 3
7 2 1
Sample Output
7
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class Main {
static final int N = 2501;
static final int M = 6501;
static final int INF = 0x3f3f3f3f;
static int G[][] = new int[N][N]; //建立图
static int dist[] = new int[N]; //起始点到每个结点的距离
static int vis[] = new int[N]; //标记结点是否被遍历过
static int path[] = new int[N]; //标记路径
static int n,m; //顶点数 边数
static int s, t; //起点终点
static void Init() //初始化邻接矩阵
{
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
if(i == j) G[i][j] = 0; //从当前点到当前点的距离为0 矩阵对角线
else G[i][j] = INF; //其他区域初始化为无穷大
}
}
}
static void Dijkstra()
{
for(int i = 1; i <= n; i++) {
dist[i] = G[s][i]; //对起始点到i的距离的初始化
path[i] = -1; //路径全都初始化为-1
}
vis[s] = 1; //起始点标记为1
for(int i = 1; i <= n; i++) {
//每次找距离起点距离最小的值 v,对周围的结点距离起点的距离进行更新 遍历n次
int min = INF,v = 0; //取最小值
//遍历所有的点 找到距离起点最小的点
for(int j = 1; j <= n; j++)