设计一个交通查询系统,能让游客查询从任一城市顶点到另一城市顶点之间的最短路径或最低花费或最少时间等问题。对于不同查询要求,可输入城市间的路程或所需时间或所需费用。
本程序共分三个部分:
(1)建立交通网络图的存储结构;
(2)单源最短路径;
(3)实现两个城市顶点之间的最短路径。
单片机源程序如下:
- #include <stdio.h>
- #include <stdlib.h>
- #define MVNum 100
- #define Maxint 32767
- enum boolean{FALSE,TRUE};
- typedef char VertexType;
- typedef int Adjmatrix;
- typedef struct {
- VertexType vexs[MVNum];
- Adjmatrix arcs[MVNum][MVNum];
- }MGraph;
- int D1[MVNum],P1[MVNum];
- int D[MVNum][MVNum],P[MVNum][MVNum];
- //文件名CreateMGraph.c
- void CreateMGraph(MGraph *G,int n,int e)
- {//采用邻接矩阵表示法构造有向图G,n,e表示图的当前顶点数和边数
- int i,j,k,w;
- for(i=1;i<=n;i++)
- G->vexs[i]=(char)i;
- for(i=1;i<=n;i++)
- for(j=1;j<=n;j++)
- G->arcs[i][j]=Maxint;//初始化邻接矩阵
- printf("输入%d条边的i、j及w:\n",e);
- for(k=1;k<=e;k++)
- {
- scanf("%d,%d,%d,",&i,&j,&w);
- G->arcs[i][j]=w;
- }
- printf("有向图的存储结构建立完毕\n");
- }
-
- //文件dijkstra.c
- void Dijkstra(MGraph *G ,int v1,int n)
- {
- int D2[MVNum],P2[MVNum];
- int v,i,w,min;
- enum boolean S[MVNum];
- for(v=1;v<=n;v++)
- {
- S[v]=FALSE;
- D2[v]=G->arcs[v1][v];
- if(D2[v]<Maxint)
- P2[v]=v1;
- else
- P2[v]=0;
- }
- D2[v1]=0;
- S[v1]=TRUE;
- for(i=2;i<n;i++)
- {
- min=Maxint;
- for(w=1;w<=n;w++)
- if(!S[w]&& D2[w]<min)
- {
- v=w;
- min=D2[w];
- }
- S[v]=TRUE;
- for(w=1;w<=n;w++)
- if(!S[w] && (D2[v]+G->arcs[v][w]<D2[w]))
- {
- D2[w]=D2[v]+G->arcs[v][w];
- P2[w]=v;
- }
- }
- printf("路径长度路径\n");
- for(i=1;i<=n;i++)
- {
- printf("%5d",D2[i]);
- printf("%5d",i);
- v=P2[i];
- while(v!=0)
- {
- printf("<-%d",v);
- v=P2[v];
- }
- printf("\n");
- }
- }
-
- //文件floyd.c
- void Floyd(MGraph *G,int n)
- {
- int i,j,k,w;
- for(i=1;i<=n;i++)
- for(j=1;j<=n;j++)
- {
- if(G->arcs[i][j]!=Maxint)
- P[i][j]=j;
- else
- P[i][j]=0;
- D[i][j]=G->arcs[i][j];
- }
- for(k=1;k<=n;k++)
- {
- for(i=1;i<=n;i++)
- for(j=1;j<=n;j++)
- {
- if(D[i][k]+D[k][j]<D[i][j])
- {
- D[i][j]=D[i][k]+D[k][j];
- P[i][j]=P[i][k];
- }
- }
- }
- }
- void main()
- {
- MGraph *G;
- int m,n,e,v,w,k;
- int xz=1;
- G=(MGraph *)malloc(sizeof(MGraph));
- printf("输入图中顶点个数和边数n,e:");
- scanf("%d,%d",&n,&e);
- CreateMGraph(G,n,e);
- while(xz!=0)
- {
- printf("********求城市之间的最短路径********\n");
- printf("====================================\n");
- printf("1.求一个城市到所有城市的最短路径\n");
- printf("2.求任意的两个城市之间的最短路径\n");
- printf("====================================\n");
- printf("请选择: 1、或 2、选择 0、退出:");
- scanf("%d",&xz);
- if(xz==2)
- {
- Floyd(G,n);
- printf("输入源点(或称起点)和终点:v,w:");
- scanf("%d,%d",&v,&w);
- k=P[v][w];
- if(k==0)
- printf("顶点%d到%d无路径!\n",v,w);
- else
- {
- printf("从顶点%d到%d的最短路径是:%d!\n",v,w,v);
- while(k!=w)
- {
- printf("->%d",k);
- k=P[k][w];
- }
- printf("->%d",w);
- printf("路径长度:%d\n",D[v][w]);
- }
- }
- else
- if(xz==1)
- {
- printf("求单源路径,输入源点v:");
- ^^^^^限于篇幅余下内容下载附件^^^^^^
复制代码
全部资料51hei下载地址:
程序.rar
(1.29 KB, 下载次数: 11)
|