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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

图的邻接矩阵表示与最短路径算法( Dijkstra )代码实现

發(fā)布時(shí)間:2025/3/21 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图的邻接矩阵表示与最短路径算法( Dijkstra )代码实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
#include <stdio.h>#define MAX_VERTEX_NUM 20 //最大頂點(diǎn)個(gè)數(shù)typedef int VRTYPE, InfoType; typedef enum {DG, DN, UDG, UDN} GraphKind; //{有向圖、有向網(wǎng)、無向圖、無向網(wǎng)} typedef struct ArcCell {VRTYPE adj; //無權(quán)圖為0或1; 帶權(quán)圖為權(quán)值InfoType *info; }ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct {AdjMatrix arcs; //鄰接矩陣,這里以數(shù)組下標(biāo)唯一標(biāo)識(shí)每個(gè)頂點(diǎn)int vexnum, arcnum;GraphKind kind; }MGraph;void create_G(MGraph *G) { int i, j, v;printf("輸入頂點(diǎn)數(shù):\n");scanf("%d", &G->vexnum);printf("輸入弧數(shù):\n");scanf("%d", &G->arcnum);for (int m = 0; m < G->vexnum; m++)for (int n = 0; n < G->vexnum; n++)G->arcs[m][n].adj = -1; //不聯(lián)通的弧設(shè)置其弧長(zhǎng)為-1printf("請(qǐng)按照起點(diǎn)號(hào)、終點(diǎn)號(hào)、弧長(zhǎng)輸入每條弧的信息:\n");for (int k = 0; k < G->arcnum; k++){scanf("%d%d%d", &i, &j, &v); //有弧連接的頂點(diǎn)對(duì)以及弧的權(quán)重,弧從i指向j(默認(rèn)有向圖)G->arcs[i][j].adj = v;} }void show_G(MGraph G) //展示創(chuàng)建的鄰接矩陣 {printf("\n創(chuàng)建的鄰接矩陣:\n");for (int m = 0; m < G.vexnum; m++){for (int n = 0; n < G.vexnum; n++)printf("%3d ", G.arcs[m][n].adj);printf("\n");}printf("\n"); }void ShortestPath_DIJ(MGraph G, int v0) //最短路算法 {int D[MAX_VERTEX_NUM];bool S[MAX_VERTEX_NUM] = { false };for (int i = 0; i < G.vexnum; i++)D[i] = G.arcs[v0][i].adj;D[v0] = 0;S[v0] = true;for (int i = 0; i < G.vexnum; i++){int j = 0, min = 0;for (int m = 0; m < G.vexnum; m++) //找出當(dāng)前必定是最短路的點(diǎn){if (min == 0 && D[m] != -1 && !S[m]){min = D[m];j = m;}else if (D[m] < min && D[m] != -1 && !S[m]){j = m;}}S[j] = true;for (int k = 0; k < G.vexnum; k++) //更新if (!S[k])if (G.arcs[j][k].adj != -1){if (D[k] == -1)D[k] = D[j] + G.arcs[j][k].adj;else if (D[j] + G.arcs[j][k].adj < D[k])D[k] = D[j] + G.arcs[j][k].adj;}}printf("\n編號(hào)為%d頂點(diǎn)到其它頂點(diǎn)的最短路:\n", v0);for (int i = 0; i < G.vexnum; i++)printf("%d ", D[i]); }void main() {MGraph G;create_G(&G);show_G(G);ShortestPath_DIJ(G, 0); }

總結(jié)

以上是生活随笔為你收集整理的图的邻接矩阵表示与最短路径算法( Dijkstra )代码实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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