最小生成樹(prim和kruskal)

2021-10-01 03:51:36 字數 1620 閱讀 1197

建圖之後,首先對邊的權值排序,每次取出沒有被選中並且最小的邊,用並查集判斷邊的兩點是否相連,如果相連則跳過找下乙個點,否則連線著兩個點,當連線的邊數等於點數-1時,就找到了最小生成樹。

例題:networking poj - 1287

#include

#include

#include

#define max_n 55

using

namespace std;

int father[max_n]

;struct edgee[max_n*max_n]

;bool

cmp(edge a,edge b)

intfindd

(int x)

intmain()

for(

int i=

1;i<=r;i++

)sort

(e+1

,e+1

+r,cmp)

;//對邊的權值排序

for(

int i=

1;i<=r;i++)}

cout<}return0;

}

核心思路是貪心,每次找當前沒有選中的最小邊連線起來,可以用priority_queue每次彈出當前最小的邊。

例題:還是暢通工程 hdu - 1233

#include

#include

#include

#include

typedef

long

long ll;

int n;

const

int maxx =

110;

const

int inf=

0x3f3f3f3f

;[maxx]

;//存圖,為了省空間也可以用鄰接表,

bool visited[maxx]

;struct edge

edge()

;bool

operator

<

(const edge& a)

const

}e[maxx*maxx]

;std::priority_queueq;

ll prim()

} visited[1]

=1;while

(!q.

empty()

)}return ans;

}int

main()

while

(!q.

empty()

)q.pop()

;for

(int i =

1; i <= n *

(n -1)

/2; i++

) ll ans =

prim()

;for

(int i =

1; i <= n; i++)if

(ans ==-1

)printf

("?\n");

else

printf

("%lld\n"

, ans);}

return0;

}

Algorithm 最小生成樹之 Kruskal

個人觀點,較prime演算法,kurskal演算法更加的簡單,這裡我們只需要每一次去需找權值最小的那條邊就好,在這裡我們先可以利用sort進行快排,得到權值最小的map i 得到該條邊的兩個節點map i u 和map i v,這時候你需要判斷能不能用這條邊,因為最小生成樹是不能形成迴路,所以用到了...

最小生成樹 Prim

include stdio.h include stdlib.h include io.h include math.h include time.h define ok 1 define error 0 define true 1 define false 0 define maxedge 20 ...

最小生成樹 prim

演算法模型 由任意乙個頂點開始 將此頂點存入s集,剩餘頂點存入t集合 每次遍歷頂點,取一條能夠連線s與t最短邊e,直到所有頂點全部加入s include include define inf 1 30 int n,m,vis 110 low 110 int map 110 110 int init ...