日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

数据结构——基于 Dijsktra 算法的最短路径求解

發(fā)布時(shí)間:2023/12/4 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构——基于 Dijsktra 算法的最短路径求解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

實(shí)驗(yàn)七 基于 Dijsktra 算法的最短路徑求解
【實(shí)驗(yàn)?zāi)康摹?/p>

  • 掌握?qǐng)D的鄰接矩陣表示法,掌握采用鄰接矩陣表示法創(chuàng)建圖的算法。
  • 掌握求解最短路徑的 Dijsktra 算法。
    【實(shí)驗(yàn)內(nèi)容】
    問(wèn)題描述
    一張地圖包括 n 個(gè)城市,假設(shè)城市間有 m 條路徑(有向圖),每條路徑的長(zhǎng)度
    已知。給定地圖的一個(gè)起點(diǎn)城市和終點(diǎn)城市,利用 Dijsktra 算法求出起點(diǎn)到終
    點(diǎn)之間的最短路徑。
    輸入要求
    多組數(shù)據(jù),每組數(shù)據(jù)有 m+3 行。第一行為兩個(gè)整數(shù) n 和 m,分別代表城市個(gè)數(shù)
    n 和路徑條數(shù) m。第二行有 n 個(gè)字符,代表每個(gè)城市的名字。第三行到第 m+2 行每
    行有兩個(gè)字符 a、b 和一個(gè)整數(shù) d,代表從城市 a 到城市 b 有一條距離為 d 的路。
    最后一行為兩個(gè)字符,代表待求最短路徑的城市起點(diǎn)和終點(diǎn)。當(dāng) n 和 m 都等于 0
    時(shí),輸人結(jié)束。
    輸出要求
    每組數(shù)據(jù)輸出2行。第1行為一個(gè)整數(shù),為從起點(diǎn)到終點(diǎn)之間最短路的長(zhǎng)度。
    第 2 行為一串字符串,代表該路徑。每?jī)蓚€(gè)字符之間用空格隔開。
    輸入樣例
    3 3
    A B C
    A B 1
    B C 1
    C A 3
    A C
    6 8
    A B C D E F
    A F 100
    A E 30
    A C 10
    B C 5
    C D 50
    E D 20
    E F 60
    D F 10
    A F
    0 0
    輸出樣例
    2
    A B C
    60
    A E D F
    【實(shí)驗(yàn)提示】
    此實(shí)驗(yàn)內(nèi)容即為教材算法 7.15 的擴(kuò)展,原算法求出源點(diǎn) v0 到圖中其余所有
    頂點(diǎn)的最短路徑。本實(shí)驗(yàn)要求求出一個(gè)指定起點(diǎn)到一個(gè)指定終點(diǎn)的最短路徑。
    為了提高算法的效率,在求解時(shí),可以加以判斷,當(dāng)已求得的終點(diǎn)為指定終點(diǎn)
    時(shí),則可以終止求解,按要求輸出相應(yīng)結(jié)果。
  • #include<stdio.h> #include<string.h> #define INF 32767 #define MAXVEX 30 int dist[MAXVEX]; //建立dist數(shù)組int path[MAXVEX]; //建立path數(shù)組int S[MAXVEX]; //建立S數(shù)組typedef char VertexType;typedef struct graph {int n,e;VertexType vexs[MAXVEX];int edges[MAXVEX][MAXVEX]; }MGraph;void CreateMGraph(MGraph &G,int n,int e) {int value;char temp_i;char temp_j;G.n=n;G.e=e;for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(i==j)G.edges[i][j]=0;elseG.edges[i][j]=32767;}}for(int j=0;j<G.n;j++){getchar();scanf("%c",&G.vexs[j]);}int temp_number_i;int temp_number_j;for(int j=0;j<e;j++){getchar();scanf("%c %c %d",&temp_i,&temp_j,&value);for(int i=0;i<n;i++){if(G.vexs[i]==temp_i)temp_number_i=i;if(G.vexs[i]==temp_j)temp_number_j=i;}G.edges[temp_number_i][temp_number_j]=value;}}void DispMGraph(MGraph &G) {printf("輸出頂點(diǎn)信息:\n");for(int i=0;i<G.n;i++){printf("%c",G.vexs[i]);} printf("\n輸出鄰接矩陣:\n");printf("\t");for(int i=0;i<G.n;i++)printf("%8c",G.vexs[i]); for(int i=0;i<G.n;i++){printf("\n%8c",G.vexs[i]);for(int j=0;j<G.n;j++){if(G.edges[i][j]==32767) //兩點(diǎn)之間無(wú)連接時(shí)權(quán)值為默認(rèn)的32767,// 在無(wú)向圖中一般用"0"表示,在有向圖中一般用"∞",// 這里為了方便統(tǒng)一輸出 "∞"printf("%8s", "∞");elseprintf("%8d",G.edges[i][j]);}printf("\n");} }void Dijkstra(MGraph g, int v) { //求從v到其他頂點(diǎn)的最短路徑int mindis,i,j,u=0;for (i=0;i<g.n;i++){ dist[i]=g.edges[v][i]; //距離初始化S[i]=0; //S[]置空if (g.edges[v][i]<INF) //路徑初始化path[i]=v; //v→i有邊時(shí),置i前一頂點(diǎn)為velse //v→i沒邊時(shí),置i前一頂點(diǎn)為-1path[i]=-1;}S[v]=1; //源點(diǎn)編號(hào)v放入S中for (i=0;i<g.n-1;i++) //循環(huán)向S中添加n-1個(gè)頂點(diǎn){ mindis=INF; //mindis置最小長(zhǎng)度初值for (j=0;j<g.n;j++) //選取不在S中且有最小距離頂點(diǎn)uif (S[j]==0 && dist[j]<mindis) { u=j;mindis=dist[j];}S[u]=1; //頂點(diǎn)u加入S中for (j=0;j<g.n;j++) //修改不在s中的頂點(diǎn)的距離if (S[j]==0)if (g.edges[u][j]<INF&& dist[u]+g.edges[u][j]<dist[j]){ dist[j]=dist[u]+g.edges[u][j];path[j]=u;}} }void Print(MGraph G,int v,int w) {printf("\n");for(int i=0;i<G.n;i++){if(i!=v && dist[i]!=INF&&i==w){printf("%c到%c的最短距離為:%d\n",G.vexs[v],G.vexs[i],dist[i]);}else if(dist[i]==INF&&i==w){printf("%c與%c之間無(wú)路徑!\n",G.vexs[v],G.vexs[i]); } } }static void Dispath(MGraph g, int v,int w) {int i, j, k;int apath[MAXVEX], d; //存放一條最短路徑(逆向)及其頂點(diǎn)個(gè)數(shù)//循環(huán)輸出從頂點(diǎn)v到i的路徑for(i = 0; i < g.n; i++){if(S[i] == 1 && i != v&&i==w){printf("%d\n",dist[i]);d = 0; apath[d] = i; //添加路徑上的終點(diǎn)k = path[i];if(k == -1) //沒有路徑的情況printf("無(wú)路徑\n");else //存在路徑時(shí)輸出該路徑{while(k != v){d++;apath[d] = k;k = path[k];}d++; apath[d] = v; //添加路徑上的起點(diǎn)printf("%c ", g.vexs[apath[d]]); //先輸出起點(diǎn)for(j = d - 1; j >= 0; j--) //再輸出其余頂點(diǎn)printf(" %c ", g.vexs[apath[j]]);printf("\n");}}} }int main() {MGraph G;int n,e;do{scanf("%d%d",&n,&e);if(n==0&&n==0)break;CreateMGraph(G,n,e);char a,b;getchar();scanf("%c %c",&a,&b);int indexa,indexb;for(int i=0;i<G.n;i++){if(a==G.vexs[i])indexa=i;if(b==G.vexs[i])indexb=i; }Dijkstra(G,indexa);Dispath(G,indexa,indexb);}while(1);return 0;}

    總結(jié)

    以上是生活随笔為你收集整理的数据结构——基于 Dijsktra 算法的最短路径求解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。