標(biāo)題:
有關(guān)數(shù)據(jù)結(jié)構(gòu)的C++程序-城市交通最短路徑問(wèn)題
[打印本頁(yè)]
作者:
kid4869
時(shí)間:
2019-5-21 18:31
標(biāo)題:
有關(guān)數(shù)據(jù)結(jié)構(gòu)的C++程序-城市交通最短路徑問(wèn)題
設(shè)計(jì)一個(gè)交通查詢(xún)系統(tǒng),能讓游客查詢(xún)從任一城市頂點(diǎn)到另一城市頂點(diǎn)之間的最短路徑或最低花費(fèi)或最少時(shí)間等問(wèn)題。對(duì)于不同查詢(xún)要求,可輸入城市間的路程或所需時(shí)間或所需費(fèi)用。
本程序共分三個(gè)部分:
(1)建立交通網(wǎng)絡(luò)圖的存儲(chǔ)結(jié)構(gòu);
(2)單源最短路徑;
(3)實(shí)現(xiàn)兩個(gè)城市頂點(diǎn)之間的最短路徑。
0.png
(279.41 KB, 下載次數(shù): 50)
下載附件
2019-5-21 23:33 上傳
單片機(jī)源程序如下:
#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òu)造有向圖G,n,e表示圖的當(dāng)前頂點(diǎn)數(shù)和邊數(shù)
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("有向圖的存儲(chǔ)結(jié)構(gòu)建立完畢\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("路徑長(zhǎng)度路徑\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("輸入圖中頂點(diǎn)個(gè)數(shù)和邊數(shù)n,e:");
scanf("%d,%d",&n,&e);
CreateMGraph(G,n,e);
while(xz!=0)
{
printf("********求城市之間的最短路徑********\n");
printf("====================================\n");
printf("1.求一個(gè)城市到所有城市的最短路徑\n");
printf("2.求任意的兩個(gè)城市之間的最短路徑\n");
printf("====================================\n");
printf("請(qǐng)選擇: 1、或 2、選擇 0、退出:");
scanf("%d",&xz);
if(xz==2)
{
Floyd(G,n);
printf("輸入源點(diǎn)(或稱(chēng)起點(diǎn))和終點(diǎn):v,w:");
scanf("%d,%d",&v,&w);
k=P[v][w];
if(k==0)
printf("頂點(diǎn)%d到%d無(wú)路徑!\n",v,w);
else
{
printf("從頂點(diǎn)%d到%d的最短路徑是:%d!\n",v,w,v);
while(k!=w)
{
printf("->%d",k);
k=P[k][w];
}
printf("->%d",w);
printf("路徑長(zhǎng)度:%d\n",D[v][w]);
}
}
else
if(xz==1)
{
printf("求單源路徑,輸入源點(diǎn)v:");
^^^^^限于篇幅余下內(nèi)容下載附件^^^^^^
復(fù)制代碼
全部資料51hei下載地址:
程序.rar
(1.29 KB, 下載次數(shù): 11)
2019-5-21 23:35 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1