给一个n(1 ≤ n ≤ 2500) 个点 m(1 ≤ m ≤ 6200) 条边的无向图,求 s 到 t 的最短路。
输入格式:
第一行四个由空格隔开的整数 n、m、s、t。
之后的 m 行,每行三个正整数 si、ti、wi(1≤wi≤109),表示一条从si 到 ti 长度为 wi 的边。
输出格式:
一个整数,表示从s 到t 的最短路径长度。数据保证至少存在一条道路。
输入样例:
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
输出样例:
7
注意:
两个顶点之间可能存在多条直接相连的道路。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N = 2510;
int n,m,s,t;
int G[N][N];
int d[N];
bool vis[N];
void Dijkstra(){
memset(d,0x3f,sizeof d);
d[s] = 0;
for(int i = 0;i<n;i++){
int u = -1;
for(int j = 1;j<=n;j++){
if(!vis[j] && (u==-1 ||d[j]<d[u])){
u = j;
}
}
for(int j = 1;j<=n;j++){
d[j] = min(d[j],G[u][j]+d[u]);
vis[u] = true;
}
}
}
int main(){
int u,v,w;
scanf("%d %d %d %d",&n,&m,&s,&t);
memset(G,0x3f,sizeof G);
for(int i = 0;i<m;i++){
scanf("%d %d %d",&u,&v,&w);
G[u][v] = G[v][u] = min(G[u][v],w);
}
Dijkstra();
printf("%d",d[t]);
return 0;
}