朴素Dijkstra求最短路 I
$\cal{Dist}$ 表示从 1 号点走到每个点的距离
$\cal{St[ I ]}$:最短距离集合中的i点
$\cal{g[i][j]}$ : 点i到点j的(最短)距离
步骤:
构造图
1.dist[1] = 0, dist[v] = INT_MAX;
2.循环1~n 每个点
3.更新t:不在st中的距离最近的点(距离值从1号点到当前点的最短距离)
4.T -> s 加到st结合中
5.用t更新其他点的距离
样例
3 3
1 2 2
2 3 1
1 3 4
算法1
$O(n^2)$
时间复杂度
参考文献
y总代码
C++ 代码
#include<iostream>
#include<cstring>
using namespace std;
const int N = 510;
int dist[N], g[N][N], n;
bool st[N];
int dijkstra ()
{
/*求最小值,初始值应该设最大*/
memset(dist, 0x3f, sizeof(dist));
dist[1] = 0;
/*循环n-1次以后所有点的最短路就可以确定了*/
/*最多需要n-1 层循环,因为初始值dist 是最大值,在每一次循环的时候都会更新每个点的dist值,直到这个点dist最小*/
for(int i = 0; i < n - 1; ++i)
{
/*t = -1表示未确定 用来在每一轮循环的时候确定一个到点1距离最小的点t*/
int t = -1;
for(int j = 1; j <= n; ++j)
{
if(!st[j] && (t == -1 || dist[t] > dist[j]))
{
t = j;
}
}
st[t] = true;
for(int j =1; j <= n; ++j)
{
/*用t更新其他点到点1的距离*/
dist[j] = min(dist[j], dist[t] + g[t][j]);
}
}
if(dist[n] == 0x3f3f3f3f) return -1;
return dist[n];
}
int main()
{
int m;cin >> n >> m;
int a, b, c;
memset(g, 0x3f, sizeof(g));
while(m--)
{
cin >> a >> b >> c;
/*去重边, 求最短距离*/
g[a][b] = min(g[a][b], c);
}
cout << dijkstra() << endl;
return 0;
}