题目描述
有一个 n个点 m 条边的无向图,请求出从 s 到 t的最短路长度。
输入格式
第一行四个正整数 n, m, s, t。 接下来 m 行,每行三个正整数 u, v, w,表示一条连接 u, v 长为 w 的边。
1≤n≤2500,1≤m≤6200,1≤w≤1000。
输出格式
输出一行一个整数,表示答案。
样例输入
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<iostream>
using namespace std;
int dis[2510][2510];
#define inf 999999
int n, m, s, t;
int main()
{
cin >> n >> m >> s >> t;
int i, j, k,x;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
dis[i][j] = inf;
}
}
for (i = 1; i <= n; i++)
{
dis[i][i] = 0;
}
for (k = 1; k <= m; k++)
{
cin >> i >> j >> x;
dis[i][j] = x;
dis[j][i] = x;
}
for (k = 1; k <= n; k++)
{
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
if (dis[i][k]!=inf && dis[k][j] != inf && dis[i][j] > dis[i][k] + dis[k][j])
dis[i][j] = dis[i][k] + dis[k][j];
}
}
}
cout << dis[s][t] << endl;
return 0;
}
偷懒用了Floyd算法,但t了三个点,完全通过的话应该用Dijkstra加各种优化或者SPFA,具体可自行前往https://www.luogu.com.cn/problem/P1339查看