1.圖的儲存結構
採用邊集陣列儲存圖。
2.定義parent[i]陣列,輔助完成連通分量的處理。陣列分量的值表示頂點i的雙親結點(初值為-1)
當一條邊(u,v)的兩個頂點的根結點不同時,這兩個結點屬於不同的連通分量(利用parent陣列查詢一棵樹的根節點。當乙個結點n的parent==-1,樹的根節點即為n)
來判斷一條邊所依附的兩個頂點在同乙個連通分量中
3.將一條邊所依附的兩個頂點合併到同乙個連通分量中要進行連通分量的合併,其中乙個頂點所在樹的根節點為vex1,令乙個頂點所在的樹的根節點為vex2,則:parenr[vex2]=vex1;
演算法分析:
1.初始化parent陣列,定義計數器count(記錄加入到生成樹中的頂點的個數);
2.對邊集陣列進行排序
3.依次考察邊集陣列中的每一條邊(u,v)
3.1確定u所在的樹的根節點vex1;
3.2確定v所在的樹的根節點vex2;
3.3如果vex1!=vex2;,則進行
a。parent[vex2]=vex1;//將第乙個結點的父親設為第二個結點的父親,合併為乙個連通分量
b.count++;
c.如果count==n-1,演算法結束 。
int
main()
sort
(edges,g)
;for
(int i=
0;i++i)
parent[i]=-
1;//每個結點分屬於不同的集合
int k=
0,begin,end,count=0;
cout<<
"next is the mst:"
int k=
0;k++k)
}return0;
}int
find
(int
*parent,
int node)
最小(代價)生成樹
從圖中任意取出乙個頂點,把他當作一棵樹,然後從這棵樹相接的邊中選取一條最短 權值最小 的邊,並將這條邊及其所連線的頂點也併入這棵樹中,此時得到一顆有兩個頂點的樹。然後在這棵樹中相連的頂點中選取最短的邊,並將圖中的所有頂點併入樹中為止,此時得到的樹就是最小生成樹。流程如圖 普利姆演算法 void pr...
poj 2075 最小生成樹Kruskal演算法
include include include include include include define n 5000 using namespace std int p n u n v n double w n maps bool cmp const int a,const int b cin...
最小生成樹 Prim演算法和Kruskal演算法
最小生成樹 3條構造最小生成樹的準則 只能使用該網路中的邊來構造最小生成樹 只能使用恰好n 1條邊來聯結網路中的n個結點 選用的這個n 1條邊不能構成迴路。mst性質 假設n v,是乙個連通網,u是頂點集合v的乙個非空子集。若 u,v 是一條具有最小值 代價 的邊,其中u屬於u,v屬於v u 即u對...