给一个 n(1≤n≤2500) 个点 mm(1≤m≤6200) 条边的无向图,求 s 到 t 的最短路。
输入格式
第一行四个由空格隔开的整数 n、m、s、t。
之后的 m 行,每行三个正整数 si、ti、wi wi(1≤wi≤109),表示一条从 si 到 ti 长度为 wi 的边。输出格式
一个整数表示从 s 到 t 的最短路长度。数据保证至少存在一条道路。
样例
Inputcopy Outputcopy 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
//朴素版djkstra
//用邻接矩阵存储
#include <iostream>
#include <bitset>
#include <cmath>
#include <cstring>
using namespace std;
constexpr int N=3000;
int n,m,s,tt;
int g[N][N],dist[N];
bitset<N>st=0;
using namespace std;
int dijkstra(){
memset(dist,0x3f,sizeof(dist));
dist[s]=0;
for(int i=1;i<=n-1;i++){
int t=-1;
for(int j=1;j<=n;j++){
if(st[j]==0 and (t==-1 or dist[t]>dist[j])) t=j;
}
for(int j=1;j<=n;j++){
dist[j]= min(dist[j],dist[t]+g[t][j]);
}
st[t]=1;
}
return dist[tt];
}
int main(){
memset(g,0x3f,sizeof(g));
scanf("%d%d%d%d",&n,&m,&s,&tt);
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
g[u][v]=g[v][u]= min(g[u][v],w);
}
printf("%d", dijkstra());
}