城市最短路径查询(C语言)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;v for(w=0;w { D[v][w]=G->arcs[v][w].edge;//从v到w之间的路径长度赋值给D[v][w] for(u=0;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;u for(v=0;v for(w=0;w if(D[v][u]+D[u][w] { D[v][w]=D[v][u]+D[u][w];//最短路径的累加 for(i=0;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 && k flag=0; } printf("\n"); printf("%s",G->vexs[k].name); for(u=0;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");