64,647
社区成员
发帖
与我相关
我的任务
分享
#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;
}
}
}