#include<stdio.h>
#define MAX 10000
#define POINT 1000
int ad[POINT][POINT]; // 记录所求图信息
int dis[POINT]; // 记录起始点至各点距离
int st[POINT]; // 结点使用记录标志
int pre[POINT]; // 记录所求路径中各点的前一结点
/******************************************
_________________
dis| | | | | | | | |......
''''''''''''''''''''''''''''''''''''''''''''''
_________________
pre| | | | | | | | |......
'''''''''''''''''''''''''''''''''''''''''''''
******************************************/
int n;
void init();
int dijkstra();
int main()
{
int i,m,x,y,cost;
printf("input the line and point:");
scanf("%d,%d",&m,&n); // 输入所求图的边数和结点数
init();
for(i=1;i<=m;i++){
scanf("%d,%d",&x,&y);
scanf("%d",&cost);
if(cost<ad[x][y]){
ad[x][y]=ad[y][x]=cost;
}
}
printf("%d/n",dijkstra()); // 打印结果
for(i=1; i<=n; i++)
printf("%d ", pre[i]);
scanf("%d", &m);
return 0;
}
void init()
{
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
ad[i][j]=MAX;
if(i==j)
ad[i][j]=0;
}
}
}
int dijkstra()
{
int tmp,min,i,cnt;
st[1]=1;
pre[1]=0;
for(i=2;i<=n;i++) {
dis[i]=ad[1][i]; // 当前起始点到各点最短距离
pre[i]=1;
}
for(cnt=1;cnt<=n-1;cnt++){
min=MAX;
for(i=2;i<=n;i++){
if(st[i]==0&&dis[i]<min){ // st[]=1则该点已用过
min=dis[i];
tmp=i; // 到所剩点中距离最小值点
}
}
st[tmp]=1; // 到该点距离最短,则加入该点
if(tmp==n) // 如果该点为终点则结束
return dis[tmp];
for(i=1;i<=n;i++){
if(ad[tmp][i]<MAX&&st[i]==0){
if(dis[tmp]+ad[tmp][i]<dis[i])
dis[i]=dis[tmp]+ad[tmp][i]; // 如果该点未被使用且预测值比原始值小,计入此距离
pre[i] = tmp;
}
}
}
}