#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define infinity 100
typedef struct
{
int vexs[MAX];
int arcs[MAX][MAX];
int arc_count,vex_count;
}graph;
typedef struct
{
int weight;
int visited;
}lnode;
typedef struct
{
int vertex;
int length;
int prevex;
}path;
int main()
{
graph p;
path dist[MAX];
scanf("%d %d",&p.vex_count,&p.arc_count);
for(int i=0;i<p.vex_count;i++)
p.vexs[i]=i+1;
for(int i=0;i<p.vex_count;i++)
for(int j=0;j<p.vex_count;j++)
{
p.arcs[i][j]=MAX;
}
for(int i=0;i<p.arc_count;i++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
a--;b--;
p.arcs[a][b]=c;
}
for(int i=0;i<p.arc_count;i++)
p.arcs[i][i]=0;
int i, j, minvex; int min;
dist[0].length=0; dist[0].prevex=0; dist[0].vertex=p.vexs[0];
p.arcs[0][0]=1; /* 表示顶点v0在集合U中 */
for (i=1; i<p.vex_count; i++) {
/* 初始化集合V-U中顶点的距离值 */
dist[i].length=p.arcs[0][i];
dist[i].vertex=p.vexs[i];
if (dist[i].length!=MAX) dist[i].prevex=0;
else dist[i].prevex= -1;
}
int note;
for (i=1; i<p.vex_count;i++){
min=MAX; minvex=0;
for (j=1; j<p.vex_count; j++)
/*在V-U中选出距离值最小顶点*/
if ((dist[j].length<=min)&&(p.arcs[j][j]==0)) {
min=dist[j].length;
minvex=j;
note=j;
}
if(minvex==0)
break;
p.arcs[minvex][minvex]=1; /* 集合V-U中路径
最小的顶点为minvex */
for(j=1;j<p.vex_count;j++){
/* 调整集合V-U中的顶点的最短路径 */
if (dist[j].length>dist[minvex].length+p.arcs[minvex][j]) {
dist[j].length=dist[minvex].length+p.arcs[minvex][j];
dist[j].prevex=minvex;
}
}
if(dist[note].length==MAX)
dist[note].length=-1;
printf("1 %d %d\n",note+1,dist[note].length);
}
return 0;
}
//test
/*
6 11
1 2 50
1 3 10
1 5 45
2 3 15
2 5 10
3 1 20
3 4 15
4 2 20
4 5 35
5 4 30
6 4 3
*/
/*output
1 3 10
1 4 25
1 2 45
1 5 45
1 6 -1
*/
写的不好,凑合看一下,但是确实自己写的