#include<stdio.h>
#include<stdlib.h>
#define MAXINT 5000
#define VEX_NUM 7
#define ARC_NUM 10
typedef
struct
{
char
vexs[VEX_NUM];
int
arcs[VEX_NUM][VEX_NUM];
}Mgraph;
void
creat_Mgraph(Mgraph *G);
void
Dijkstra(Mgraph Gn,
int
v,
int
path[],
int
dist[]);
void
Putpath(
int
v,
int
p[],
int
d[]);
void
printpath(
int
v,
int
u,
int
p[],
int
d[]);
main()
{
char
city[7][20]={
"beijing"
,
"xian"
,
"zhengzhou"
,
"xuzhou"
,
"chengdu"
,
"guangzhou"
,
"shanghai"
};
Mgraph Gn;
int
i,m,n;
int
path[VEX_NUM],dist[VEX_NUM];
char
s[4];
for
(;;)
{
printf
(
"1.建立交通图的存储结构\n"
);
printf
(
"2.求某城市到所有城市的最短路径\n"
);
printf
(
"3.求任意两个城市之间的最短路径\n"
);
printf
(
"4.退出\n"
);
gets
(s);
switch
(*s)
{
case
'1'
:creat_Mgraph(&Gn);
break
;
case
'2'
:
printf
(
"请输入城市:\n"
);
scanf
(
"%d"
,&i);
Dijkstra(Gn,i,path,dist);
Putpath(i,path,dist);
break
;
case
'3'
:
printf
(
"请输入城市:\n"
);
scanf
(
"%d,%d"
,&m,&n);
Dijkstra(Gn,m,path,dist);
printpath(m,n,path,dist);
break
;
case
'4'
:
exit
(0);
break
;
}
}
}
void
creat_Mgraph(Mgraph *G)
{
int
i,j,k,w;
printf
(
"\n inuput vextex:"
);
for
(i=0;i<VEX_NUM;i++)
scanf
(
"%c"
,&G->vexs[i]);
for
(i=0;i<VEX_NUM;i++)
for
(j=0;j<VEX_NUM;j++)
G->arcs[i][j]=MAXINT;
printf
(
"\n input edge(i,j,w):\n"
);
for
(k=1;k<=ARC_NUM;k++)
{
scanf
(
"%d,%d,%d"
,&i,&j,&w);
G->arcs[i][j]=w;
G->arcs[j][i]=w;
}
}
void
Putpath(
int
v,
int
p[],
int
d[])
{
int
i,j,next;
for
(i=0;i<VEX_NUM;i++)
if
(d[i]<MAXINT&&i!=v)
{
printf
(
"%c<--"
,city[i]);
next=p[i];
while
(next!=v)
{
printf
(
"%c<--"
,city[next]);
next=p[next];
}
printf
(
"%c:%d\n"
,city[v],d[i]);
}
}
void
printpath(
int
v,
int
u,
int
p[],
int
d[])
{
int
i,j,next;
for
(i=0;i<VEX_NUM;i++)
if
(d[i]<MAXINT&&i==u)
{
printf
(
"%c<--"
,city[i]);
next=p[i];
while
(next!=v)
{
printf
(
"%c<--"
,city[next]);
next=p[next];
}
printf
(
"%c:%d\n"
,city[v],d[i]);
}
}
void
Dijkstra(Mgraph Gn,
int
v,
int
path[],
int
dist[])
{
int
i,j,w,k,min;
int
s[VEX_NUM];
for
(j=0;j<VEX_NUM;j++)
{
s[j]=0;
dist[j]=Gn.arcs[v][j];
if
(dist[j]<MAXINT)
path[j]=v;
else
path[j]=-1;
}
dist[v]=0;
s[v]=1;
for
(i=0;i<VEX_NUM;i++)
{
min=MAXINT;
for
(w=0;w<VEX_NUM;w++)
if
(!s[w]&&dist[w]<min)
{
j=w;
min=dist[w];
}
s[j]=1;
for
(k=0;k<VEX_NUM;k++)
if
(!s[k]&&(min+Gn.arcs[j][k]<dist[k]))
{
dist[k]=min+Gn.arcs[j][k];
path[k]=j;
}
}
}