#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是未連線,若連線,則數值等於權值 也可以用兩個矩陣分別表示連線情況和權值。本...