城市最短路径查询(C语言)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

#include

#include

#define INFINITY 32767 //INF 表示无穷大

#define MAX_VERTEX_NUM 10

typedef struct

{

int edge; //边的权值

}AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //两点之间路径长度

typedef struct //景点信息

{

char name[30];

int num;

}infotype;

typedef struct

{

infotype vexs[MAX_VERTEX_NUM]; //顶点向量

AdjMatrix arcs; //邻接矩阵

int vexnum,arcnum; //图的当前顶点数和弧数

}MGraph;

MGraph b;

//函数声明

MGraph InitGraph();

void Floyd(MGraph *G);

void Menu();

void cmd();

MGraph InitGraph()//初始化顶点和权值

{

MGraph G;

int i,j;

G.vexnum=6;

G.arcnum=6;

for(i=0;i

G.vexs[i].num=i;

strcpy(G.vexs[0].name,"十堰");

strcpy(G.vexs[1].name,"襄樊");

strcpy(G.vexs[2].name,"随州");

strcpy(G.vexs[3].name,"武汉");

strcpy(G.vexs[4].name,"黄石");

strcpy(G.vexs[5].name,"荆州");

strcpy(G.vexs[6].name,"宜昌");

for(i=0;i

for(j=0;j

{ G.arcs[i][j].edge=INFINITY;

if(i==j) G.arcs[i][j].edge=0;}

G.arcs[0][1].edge=G.arcs[1][0].edge=145;

G.arcs[1][2].edge=G.arcs[2][1].edge=124;

G.arcs[1][5].edge=G.arcs[5][1].edge=188;

G.arcs[1][6].edge=G.arcs[6][1].edge=169;

G.arcs[2][3].edge=G.arcs[3][2].edge=149;

G.arcs[2][5].edge=G.arcs[5][2].edge=187;

G.arcs[3][4].edge=G.arcs[4][3].edge=83;

G.arcs[4][5].edge=G.arcs[5][4].edge=269;

G.arcs[5][6].edge=G.arcs[6][5].edge=178;

return G;

}

/*Floyd算法求最短路径*/

void Floyd(MGraph *G)

{

int v,u,i,w,k,j,flag=1,p[11][11][11],D[11][11];

for(v=0;vvexnum;++v)

for(w=0;wvexnum;++w)

{

D[v][w]=G->arcs[v][w].edge;//从v到w之间的路径长度赋值给D[v][w]

for(u=0;uvexnum;++u)

p[v][w][u]=0;//u不是v到w之间最短路径上的顶点

if(D[v][w]

{

p[v][w][v]=1;p[v][w][w]=1;

}

}

for(u=0;uvexnum;++u)

for(v=0;vvexnum;++v)

for(w=0;wvexnum;++w)

if(D[v][u]+D[u][w]

{

D[v][w]=D[v][u]+D[u][w];//最短路径的累加

for(i=0;ivexnum;++i)

p[v][w][i]=p[v][u][i] || p[u][w][i];//分半开始找途径i,v和u 之间或w和u之间的路径长度

}

while(flag)

{

printf("请输入出发点和目的地的编号(注意:输入编号时用空格号分割):");

scanf("%d%d",&k,&j);

if(k<0 || k>G->vexnum || j<0 || j>G->vexnum)

{

printf("景点编号不存在!请重新输入起点和终点的编号:");

scanf("%d %d",&k,&j);

}

if(k>=0 && kvexnum && j>=0 && jvexnum )

flag=0;

}

printf("\n");

printf("%s",G->vexs[k].name);

for(u=0;uvexnum;++u)

if(p[k][j][u] && k!=u && j!=u && D[k][j]!=INFINITY)

printf("-->%s",G->vexs[u].name);//输出途径的景点

printf("-->%s",G->vexs[j].name);

printf(" 最短路径为: %dm\n",D[k][j]);

if(D[k][j]==INFINITY) printf("\n无法到达!\n");

}

void Menu()//菜单界面

{

printf("\n\n\n");

printf("\t\t *--------------------------------------*\t\n");

printf("\t\t *-----欢迎使用湖北省地图路径查询程序---*\t\n");

printf("\t\t ****************************************\t\n");

printf("\t\t *--------------------------------------*\t\n");

printf("\t\t * 1.选择出发点和目的地*\t\n");

相关文档
最新文档