建圖之後,首先對邊的權值排序,每次取出沒有被選中並且最小的邊,用並查集判斷邊的兩點是否相連,如果相連則跳過找下乙個點,否則連線著兩個點,當連線的邊數等於點數-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 ...