#kruskal演算法最小生成樹
**思路見注釋和printf內容。
本**在code::blocks 17.12中可以執行。
#include
#include
#define max 64
typedef
struct graphgraph;
typedef
struct edgeweightedg;
typedef
struct heapheap;
///圖:輸出圖
void
output_graph
(graph* g)
printf
("\n");
for(
int i=
0;ivexnum;i++
)printf
("%8d"
,g->adjmartix[i]
[j]);}
printf
("\n");
}}///圖:建立乙個模板圖
graph*
create_sample_graph
(void
)///圖:獲得節點編號
intget_position
(graph* g,
char
* c)
}//printf("未找到\n");
return-1
;}///圖:初始化圖
void
initvisit
(graph* g)
}///最小堆:建立空最小堆
heap*
create_heap
(graph* g)
///最小堆:給最小堆插入新數
void
insert
(heap* h,edg x)
}///最小堆:以完全二叉樹的形式輸出最小堆
void
output_heap
(heap* h)
}printf
("\n");
limt=limt*2;
}}///最小堆:輸出並刪除最小堆最小的的節點
edg delete_min
(heap* h)
elseif(
(h->data[i]
.weight)
>
(h->data[child]
.weight)
)else
i=child;
}return res;
}///最小生成樹:生成
void
kruskal
(graph* g)}}
output_heap
(edgeheap)
;//堆已經建好,每次輸出一組點,用並查集的思想,只收錄非環路點
int parent[g->vexnum]
;int jroot,iroot;
for(
int i=
0;ivexnum;i++
)while(1
)printf
("本輪%d(%d---%d)\n"
,tempedge.weight,tempedge.i,tempedge.j)
; iroot=
root
(tempedge.i,parent)
;//找到i的最終父節點iroot
jroot=
root
(tempedge.j,parent)
;//找到j的最終父節點jroot
printf
("iroot=%d,jroot=%d\n"
,iroot,jroot);if
(jroot!=iroot)
else
if(parent[tempedge.j]==-
1)}else}}
///並查集:找到x在parent樹里的最終父節點
introot
(int x,
int* parent)
else
return x;
//否則,一直上溯到parent[x]=-1的x才是最終父節點,並把parent[x]設為向上追溯的級數}}
intmain()
最小生成樹 kruskal(演算法)
最小生成樹 圖中有好多點呀 n個 讓我們找到n 1條邊,來把他們連上吧,但是要讓這n 1條邊的和最小。kruskal演算法 把所有邊由公升序排列,然後從最小的一條邊找起,如果這條邊的兩點不屬於乙個集合 此處運用並查集 那麼就要這條邊,否則,忽略這條邊吧 一直這樣找下去,直到找了n 1條邊為止,此時,...
最小生成樹 Kruskal演算法
1.概覽 kruskal演算法是一種用來尋找最小生成樹的演算法,由joseph kruskal在1956年發表。用來解決同樣問題的還有prim演算法和boruvka演算法等。三種演算法都是貪婪演算法的應用。和boruvka演算法不同的地方是,kruskal演算法在圖中存在相同權值的邊時也有效。2.演...
最小生成樹 kruskal演算法
2016.12.30 演算法思想 先將邊按照權值排序,從權值最小的邊開始列舉,如果當前邊連線的兩個點不屬於同一集合,就將這兩個點連起來 用到的資料結構是並查集 一直到列舉完所有的邊,此時生成的就是最小生成樹 include include include include using namespac...