最小生成樹是在圖論中的乙個重要的問題,我們找乙個圖的最小生成樹,也就是找鏈結所有的頂點,並且使得各邊的代價之和最小。當然最小生成樹的程式的編寫也是相當的複雜,資料結構書上也有通過prim演算法來建立最小生成樹,當然在這個地方我們是通過克魯斯卡爾演算法:(假設乙個連通網n=(v,),則令最小生成樹的初始狀態為只有n個頂點而無邊的非連同圖t=(v,{}),圖中的每乙個頂點自成乙個連同分量。在e中選擇代價最小的邊,如果該邊依附的頂點落在t中不同的連線分量上,則將此邊加入到t中,否則捨去此邊而選擇下一條代價最小的邊,依次類推,一直到t的所有 的頂點都在乙個連通分量上為止。)來建立乙個圖的最下生成樹。
首先我們應該先建立乙個圖:
typedef struct arcnode
arcnode;
//定義頭節點資訊
typedef struct vnode
vnode,adjlist[max_vertex_num];
typedef structalgraph;
這個地方我們是使用的鄰接表來儲存乙個圖,這個在資料結構(嚴蔚敏)p163可以找到。
第二步:建立乙個無向圖
status createudn(algraph *g,sqlist *l)
//接著要做的事情也即是填充邊
cout<<"請輸入邊的資訊:(a,b,value)"return ok;
}void showudn(algraph *g)
cout<}}
需要注意的是,我們在建立無向圖的時候,不僅僅是建立了乙個圖,同時也將每個弧的資訊存放到乙個連線表中了,這個地方是方便一以後通過各邊的權值進行乙個大小的排序。
l->elem[i].data1=a;
l->elem[i].data2=b;
l->elem[i].value=value;
l->length++;
第三步:根據各邊的權值對邊進行從小到大的乙個排序,這個地方排序採用的是直接插入排序法
void insertsort(sqlist *l)
}插入排序之後我們將弧按照權值的大小存放在乙個線性表中,然後我們需要做的事情是從線性表中將邊依次拿出來連線連通分量,如果每次都是是連線兩個連通分量說明沒有構成環,當其中的弧連線是乙個連通圖中的兩個點的時候這個時候這個弧我們就要捨棄不用,繼續下乙個較大的弧依次這樣,知道圖中的弧的個數比頂點的個數小1的時候,說明最小生成樹構造成功。具體程式請見下一節:最小生成樹(2)。
最小生成樹練習1
今天就做點kruskal的水題,晚一會兒繼續做 include include include include define m 15005 using namespace std struct edge arr m int fa m bool cmp edge a,edge b return su...
最小生成樹 次小生成樹
一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...
最小生成樹
package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...