水。。
#include <iostream>
using namespace std;
const int N = 105;
const int INF = 0x1fffffff;
int map[N][N];
int D[N];
int flag[N];
int n, m;
void init()
{
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
map[i][j] = INF;
for(int i = 1; i <= N; i++)
map[i][i] = 0;
memset(flag, 0, sizeof(flag));
}
void dijkstra()
{
for(int i = 1; i <= n; i++)
D[i] = map[1][i];
for(int t = 1; t < n; t++)
{
int min = INF;
int index = -1;
for(int i = 1; i <= n; i++)
{
if(flag[i])
continue;
if(min > D[i])
{
min = D[i];
index = i;
}
}
flag[index] = 1;
for(int i = 1; i <= n; i++)
{
if(flag[i])
continue;
for(int j = 1; j <= n; j++)
{
if(!flag[j])
continue;
if(D[i] > D[j] + map[j][i])
D[i] = D[j] + map[j][i];
}
}
}
}
int main()
{
while(scanf("%d%d", &n, &m), n || m)
{
init();
int x, y, len;
for(int i = 0; i < m; i++)
{
scanf("%d %d %d", &x, &y, &len);
map[x][y] = map[y][x] = len;
}
dijkstra();
cout << D[n] << endl;
}
return 0;
}

本文详细介绍并实现了经典的Dijkstra最短路径算法。通过具体的代码示例,文章展示了如何初始化图结构、执行Dijkstra算法来寻找两个节点间的最短路径,并最终输出结果。适合初学者了解和学习该算法的基本原理及应用。
752

被折叠的 条评论
为什么被折叠?



