#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#define Max 30
typedef char str[30];
typedef struct{
char dian[Max];
int bian[Max][Max];
int d,b;
}ljt;
void creat(ljt &G);//有向网有注释
void disp(ljt G);
void dijstla(ljt G);
void creat(ljt &G){//有向网
int i,j,k,w;
printf("请输入顶点数和边数:\n");
scanf("%d %d",&G.d,&G.b);
fflush(stdin);
for(i=0;i<G.d;i++){
printf("请输入第%d个顶点的信息:",i+1);
scanf("%c",&G.dian[i]);
fflush(stdin);}
for(i=0;i<G.d;i++)
for(j=0;j<G.d;j++) {
if(i==j) G.bian[i][j]=0;
else G.bian[i][j]=100;
}
for(k=0;k<G.b;k++){
printf("请输入第%d边依附的两个顶点的序号和权值:",k+1);
scanf("%d %d %d",&i,&j,&w);
fflush(stdin);
G.bian[i-1][j-1]=w;
}
}
void disp(ljt G){// 显示
int i,j,k;
for(i=0;i<G.d;i++)
printf("%5c ",G.dian[i]);
printf("\n");
for(j=0;j<G.d;j++){
for(k=0;k<G.d;k++){
printf("%d ",G.bian[j][k]);
}
printf("\n");
}
}
void dijstla(ljt G){
str path[30];
int dist[30];
str s,a;
int v,i,k,num;
printf("请输入起始点:");
scanf("%d",&v);
for(i=0;i<G.d;i++){
dist[i]=G.bian[v][i];
if(dist[i]!=100&&dist[i]!=0){
path[i][0]=G.dian[v];
path[i][1]=G.dian[i];
path[i][2]='\0';
}
else
path[i][0]='\0';
}
s[0]=G.dian[v];
num=1;dist[v]=0;
while(num<G.d){
k=0;while(dist[k]==0)k++;
for(i=0;i<G.d;i++)
if(dist[i]<dist[k]&&dist[i]!=0)k=i;
printf("%d%3s ",dist[k],path[k]);
s[num++]=G.dian[k];
for(i=0;i<G.d;i++)
if(dist[i]>dist[k]+G.bian[k][i]){
dist[i]=dist[k]+G.bian[k][i];
a[0]=G.dian[i];
a[1]='\0';
strcat(path[k],a);
strcpy(path[i],path[k]);
}
dist[k]=0;
}
}
void main(){
ljt G;
creat(G);
disp(G);
dijstla(G);
}