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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构——图-最短路径长度中最大的一个

發布時間:2023/12/4 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构——图-最短路径长度中最大的一个 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.



#include<stdio.h> #include<string.h> #define INF 32767 #define MAXVEX 30 int dist[MAXVEX]; //建立dist數組int path[MAXVEX]; //建立path數組int S[MAXVEX]; //建立S數組typedef char VertexType;typedef struct graph {int n,e;VertexType vexs[MAXVEX];int edges[MAXVEX][MAXVEX]; }MGraph;void CreateMGraph(MGraph &G) {int n,e;int value;char temp_i;char temp_j;printf("請輸入圖的頂點數和邊數(以空格分隔):");scanf("%d%d",&n,&e);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;}}printf("輸入頂點信息:");for(int j=0;j<G.n;j++){getchar();scanf("%c",&G.vexs[j]);}int temp_number_i;int temp_number_j;printf("請輸入每條邊的權值:\n");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("輸出頂點信息:\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) //兩點之間無連接時權值為默認的32767,// 在無向圖中一般用"0"表示,在有向圖中一般用"∞",// 這里為了方便統一輸出 "∞"printf("%8s", "∞");elseprintf("%8d",G.edges[i][j]);}printf("\n");} }void Dijkstra(MGraph g, int v) { //求從v到其他頂點的最短路徑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有邊時,置i前一頂點為velse //v→i沒邊時,置i前一頂點為-1path[i]=-1;}S[v]=1; //源點編號v放入S中for (i=0;i<g.n-1;i++) //循環向S中添加n-1個頂點{ mindis=INF; //mindis置最小長度初值for (j=0;j<g.n;j++) //選取不在S中且有最小距離頂點uif (S[j]==0 && dist[j]<mindis) { u=j;mindis=dist[j];}S[u]=1; //頂點u加入S中for (j=0;j<g.n;j++) //修改不在s中的頂點的距離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) {printf("\n");for(int i=0;i<G.n;i++){if(i!=v && dist[i]!=INF){printf("%c到%c的最短距離為:%d\n",G.vexs[v],G.vexs[i],dist[i]);}else if(dist[i]==INF){printf("%c與%c之間無路徑!\n",G.vexs[v],G.vexs[i]); } }printf("\n"); }/*------------------輸出從頂點v出發的所有最短路徑-------------------*/ static void Dispath(MGraph g, int v) {int i, j, k;int apath[MAXVEX], d; //存放一條最短路徑(逆向)及其頂點個數//循環輸出從頂點v到i的路徑for(i = 0; i < g.n; i++){if(S[i] == 1 && i != v){printf("從頂點%c到頂點%c的路徑長度為:%d\t路徑為:", g.vexs[v], g.vexs[i], dist[i]);d = 0; apath[d] = i; //添加路徑上的終點k = path[i];if(k == -1) //沒有路徑的情況printf("無路徑\n");else //存在路徑時輸出該路徑{while(k != v){d++;apath[d] = k;k = path[k];}d++; apath[d] = v; //添加路徑上的起點printf("%c ", g.vexs[apath[d]]); //先輸出起點for(j = d - 1; j >= 0; j--) //再輸出其余頂點printf(" %c ", g.vexs[apath[j]]);printf("\n");}}} } static void Dispath2(MGraph g, int v,int w) {int i, j, k;int apath[MAXVEX], d; //存放一條最短路徑(逆向)及其頂點個數//循環輸出從頂點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; //添加路徑上的終點k = path[i];if(k == -1) //沒有路徑的情況printf("無路徑\n");else //存在路徑時輸出該路徑{while(k != v){d++;apath[d] = k;k = path[k];}d++; apath[d] = v; //添加路徑上的起點printf("%c ", g.vexs[apath[d]]); //先輸出起點for(j = d - 1; j >= 0; j--) //再輸出其余頂點printf(" %c ", g.vexs[apath[j]]);printf("\n");}}} }void min_shortest_path(MGraph G,int v) {int mindist=dist[0];int temp;for(int i=1;i<G.n;i++){if(mindist<dist[i]){mindist=dist[i];temp=i;}}printf("圖中距離頂點%c最短路徑長度中最大的為:",G.vexs[v]);Dispath2(G, v,temp);} int main() {MGraph G;CreateMGraph(G);DispMGraph(G);Dijkstra(G,0);Print(G,0);Dispath(G,0);min_shortest_path(G,0); }

總結

以上是生活随笔為你收集整理的数据结构——图-最短路径长度中最大的一个的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。