#include<cstdio>
#include<map>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int inf = 0x3f3f3f3f;
int n, m;
int graph[66][66],vis[66],dis[66];
void dijkstra(int s)//s表示源点
{
memset(vis, 0, sizeof(vis));
memset(dis, 0, sizeof(dis));
int i,j;
for (i = 1; i <= n; i++)//初始化dis数组,源点s到各个点的最短路径
{
dis[i] = graph[s][i];
}
vis[s] = 1;//dis[s]为确认值
for (i = 1; i <= n; i++)
{
int Min = inf;
int id = 0;
for (j = 1; j <= n; j++)//找到离s最近的点
{
if (vis[j] == 0 && Min > dis[j])
{
Min = dis[j];
id = j;
}
}
vis[id] = 1;//dis[id]设为确认值
for (j = 1; j <= n; j++)//通过新加入的边,来松弛s号顶点到各点的距离
{
if (vis[j] == 0 && dis[j] > dis[id] + graph[id][j])
{
dis[j] = dis[id] + graph[id][j];
}
}
}
for (i = 1; i <= n; i++)
{
if (i != s)
{
printf("%d %d %d\n", s, i, dis[i]);
}
}
}
int main()
{
cin >> n >> m;
int i, j;
for (i = 1; i <= n; i++)//初始化数组
{
for (j = 1; j <= n; j++)
{
graph[i][j] = inf;
}
}
for (i = 1; i <= m; i++)//存图
{
int a, b, c;
cin >> a >> b >> c;
graph[a][b] = c;
graph[b][a] = c;
}
dijkstra(1);
return 0;
}
最短路径-Dijkstra算法
最新推荐文章于 2024-05-20 20:08:58 发布