OJ 1342. Shortest Path
题目描述
给一个 n (1≤n≤2500) 个点 m(1≤m≤6200) 条边的无向图,求 s 到 t 的最短路的长度。
数据保证,s 出发可以到达 t 。
Input
请从 stdin 读入。
第一行为四个正整数 n, m, s, t。 第二行起 m 行,每行三个非负整数
u
i
,
v
i
,
w
i
u_i, v_i, w_i
ui,vi,wi
(
0
≤
w
i
≤
1
0
9
)
(0≤w_i≤10^9)
(0≤wi≤109),表示从
u
i
u_i
ui到
v
i
v_i
vi有一条权值为
w
i
w_i
wi的无向边。
输入点的标号为 1…n 。
Output
请输出到 stdout 中。
输出一行一个整数,表示 s 到 t 的距离。
Sample Input
Case 1
4 4 1 4
1 2 999999999
2 3 1000000000
3 4 1000000000
1 2 1000000000
Case 2
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
Case 1
2999999999
Case 2
7
Constraints
Time Limit: 1s
Memory Limit: 128MB
Code
#include <iostream>
using namespace std;
int main()
{
int n,m,s,t;
cin>>n>>m>>s>>t;
long long a[n][n];
bool visited[n];
long long dist[n];
long long upp = 10000000000000;
for(int i=0;i<n;i++){
visited[i] = false;
for(int j=0;j<n;j++){
a[i][j] = upp;
}
}
int u,v;
long long w;
for(int i=0;i<m;i++){
cin>>u>>v>>w;
if(u!=v){
if(a[u-1][v-1]>w){
a[u-1][v-1] = w;
a[v-1][u-1] = w;
}
}
}
visited[s-1] = true;
for(int i=0;i<n;i++){
dist[i] = a[s-1][i];
}
for(int i=0;i<n;i++){
int k=s-1;
for(int j=0;j<n;j++){
if(!visited[j]&&dist[j]<=dist[k]){
k=j;
}
}
visited[k] = true;
for(int j=0;j<n;j++){
if(visited[j]){
continue;
}
long long temp = a[k][j]+dist[k];
if(temp<dist[j]){
dist[j] = temp;
}
}
}
cout<<dist[t-1];
return 0;
}