#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define inf 0x3f3f3f3f
int dis[200];
int vis[200];
int map[200][200];
struct mmm
{
int x;
int y;
int v;
}xxx[200];
void dijkstra(int S,int N) //S表示start,E表示终点
{
int i,j;
dis[S] = 0; //初始化起始点
vis[S] = 1;
for(i=1;i<=N;i++)
{
if(vis[i]==0) //避免自己dis[S]被赋值。
dis[i]=map[S][i]; //算出所有直达
}
for(i=1;i<=N;i++)
{
int minn = inf, mini = S; //minn在新的开始又变成了无穷大
for(j=1;j<=N;j++)
{
if(vis[j]==0&&minn>dis[j])
{
minn=dis[j];
mini=j;
}
} //第一个for每能定一个最短。
vis[mini]=1; //做标记,dis[mini]就定住哪个已经是最短了。
for(j=1;j<=N;j++)
{
if(vis[j]==0)
{
if(dis[j]>dis[mini]+map[mini][j]) //第二个for是算转达。
{ // 第n个最短,在最后一次之前已经在不断更新的,所以,每次都是最短比最新的,取最短。
dis[j]=dis[mini]+map[mini][j];
}
}
}
}
}
int main()
{
int n,m;
int i,j;
struct mmm t;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==j)
map[i][j]=0;
else map[i][j]=inf;
}
}
while(m--)
{
int i,j,val;
scanf("%d%d%d",&i,&j,&val);
map[i][j]=val;
}
dijkstra(1,n);
for(i=1;i<=n;i++)
{
xxx[i].v=dis[i];
xxx[i].y=i;
}
for(j=1;j<n;j++)
for(i=1;i<=n-j;i++)
if(xxx[i].v>xxx[i+1].v)
{
t=xxx[i];
xxx[i]=xxx[i+1];
xxx[i+1]=t;
}
for(i=2;i<=n;i++)
{
if(dis[i]==inf)
printf("1 %d -1\n",xxx[i].y);
else
printf("1 %d %d\n",xxx[i].y,xxx[i].v);
}
return 0;
}
单源最短路径(dijkstra算法 + 路径从小到大输出)
最新推荐文章于 2024-12-03 00:09:24 发布