dj的鄰接矩陣實現

2021-08-08 15:10:46 字數 1526 閱讀 2585

#include using namespace std;

const int maxn=100,bignum=100001;

int g[maxn][maxn],dis[maxn],t[maxn],siz;

bool state[maxn];

void creat(int k)

}for(int i=0;i<=siz;i++)

memset(state,true,sizeof(state));

state[k]=false;

memset(t,0,sizeof(t));

t[k]=-1;

}void addnode(int k)

dis[siz]=g[k][siz];

}int findminandstate()

{ int minpos,minsum=bignum;

for(int i=0;i<=siz;i++)

{if(state[i]==true)

{if(dis[i]>siz>>k;

siz--;k--;

creat(k);

addnode(k);

dj(k);

for(int i=0;i<=siz;i++)cout

bignum:**中用的大數,防止int溢位設乙個不大不小的100001

g:鄰接矩陣,存放輸入資料

dis:儲存節點到根節點距離的陣列

t:儲存最小生成樹

siz:儲存輸入的鄰接矩陣大小

state;儲存某個節點是否已掛上生成樹,真表示未掛上

creat():一次性讀入某個鄰接矩陣

addnode():增加節點,需要在呼叫dj之前使用,不知道能有什麼卵用

findminandstate():中間函式,用來找沒掛上生成樹的離源最近節點

dj():dj]

大概回憶一下dj的思路

目的:求乙個邊帶權有向圖中單源的最小生成樹

思路的第一步:對於圖中乙個節點vi,它所鄰接到的所有點中,把鄰接邊權值最小的那個點記作vk,則e=vi-vk一定是最小生成樹上的一條邊

呃這麼寫以後肯定看不懂

這個第一步的用處在於:每一次從圖上選擇乙個據起點最近的點,從起點到它的那條路肯定是在所需的樹上的。

那麼為了能一步步走下去,我們需要乙個陣列,儲存目前從起點到每乙個節點的距離。目前沒有發現有路的,就記作無限遠。

還有乙個就是,每一次確定了乙個點後,需要記錄下這個確定的狀態,以後找點的時候就可以忽略這個點了,同樣用乙個陣列來存。

這樣一來就可以如此描述:

起始步:將所有起點鄰接到的節點,將這個邊的長度作為目前起點到這個點的距離記錄到陣列裡。

迴圈步:對目前距起點最近且未掛上樹的節點,掛上樹,並且對這個節點鄰接到的所有點便利一次,若《這個點到某個點的邊權值》+《起點到這個點的距離》小於《此處的《某個點》到起點的距離》,那麼就把《此處的《某個點》到起點的距離》更新為《這個點到某個點的邊權值》+《起點到這個點的距離》

迴圈終止條件:所有節點都掛上樹了

鄰接矩陣實現

缺點 created by carso on 2020 3 14.ifndef c grapmatrix h define c grapmatrix h include include include 定義頂點 templatestruct vertex 定義邊 templatestruct edg...

Dijkstra 鄰接矩陣實現

dijkstra使用鄰接矩陣儲存圖對比於鄰接表,會佔據大量記憶體,但通常此類題目不會卡記憶體。鄰接矩陣表示的有向圖的dijkstra 單源最短路徑 演算法 頂點節點編號預設範圍為 0,n 1 即n個頂點編號不允許取到n includeusing namespace std define inf 0x...

鄰接矩陣實現Prim演算法

prim是尋找最小生成樹的演算法,本文利用鄰接矩陣,乙個比較方便的方式來進行prim演算法。鄰接矩陣是儲存有向或無向圖的方式,若不帶權,一般用 0 或 inf 表示未連線,用 1 表示連線。如果帶權,可以用乙個矩陣來表示,1是未連線,若連線,則數值等於權值 也可以用兩個矩陣分別表示連線情況和權值。本...