题目描述:
给一个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 的最短路长度。数据保证至少存在一条道路。
样例
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 |
思路:
从s点开始,更新到其他所有点的距离,找出最短距离的点并标记,到下一个点也更新与其他未标记的点的距离,直到所有点都被标记。
代码:
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
typedef double db;
ll lowdis[2505];
ll dis[2505][2505];
bool idx[2505];
int n,m,s,t;
void dijkstra(){
memset(lowdis,0x3f3f3f3f,sizeof(lowdis));
lowdis[s]=0;
while(1){
int tmp=0x3f3f3f3f,jud=-1;
for(int j=1;j<=n;j++){
if(idx[j]==false&&lowdis[j]<tmp){
tmp=lowdis[j];
jud=j;
}
}
if(jud==-1) break;
idx[jud]=true;
for(int j=1;j<=n;j++){
if(idx[j]==false&&dis[jud][j]!=0x3f3f3f3f){
lowdis[j]=min(lowdis[j],lowdis[jud]+dis[jud][j]);
}
}
}
}
int main(){
std::ios::sync_with_stdio(false);
cin>>n>>m>>s>>t;
memset(dis,0x3f3f3f3f,sizeof(dis));
while(m--){
int x,y;
ll z;
cin>>x>>y>>z;
dis[x][y]=min(dis[x][y],z);
dis[y][x]=min(dis[y][x],z);
}
dijkstra();
cout<<lowdis[t];
return 0;
}