資料結構筆記 最小生成樹

2021-09-02 06:38:40 字數 3269 閱讀 3582

//edge類, 表示邊的資訊

public class edgeimplements comparable

public edge(edgee)

//返回第乙個頂點

public int v()

//返回第二個頂點

public int w()

//返回權重

public weight weight()

//給定乙個頂點返回另乙個頂點

public int otherv(int v)

//輸出邊的資訊

public string tostring()

//邊之間的比較

@override

public int compareto(edge other)else if(weight.compareto(other.weight())<0)else}}

//有權稠密圖 鄰接矩陣表示

public class densegraphimplements weightgraph

@override

public void addedge(edgee)

}@override

public int v()

@override

public int e()

//檢查邊 v——>w 是否存在

@override

public boolean hasedge(int v, int w)

@override

public void show()

});}

//輔助方法,訪問節點,並挑選該節點未被訪問過的鄰邊加入優先佇列

private void visit(int v)}}

//最小生成樹實現 lazy-prim演算法

public void mst()

//若邊的另乙個端點沒有被訪問過,則該邊為最小生成樹中的一條邊

mst.add(e);

//順著這條邊接著訪問邊中那個為被訪問過的節點

if(!isvisited[e.v()])else

}//計算最小生成樹中的權重和

for(int i=0; i> mstedges()

// 返回最小生成樹的權值

public number minweight()

}

橫切邊:若一條邊中有且只有乙個節點被訪問過(被標記過),則該邊為一條橫切邊

根據切分定理,將節點切分已加入最小生成樹的部分和未加入最小生成樹的部分,從樹節點(已標記的節點)出發尋找最短橫切邊,新增該最短橫切邊直到所有結點都加入到最小生成樹。

從任意乙個點開始選擇,找出這個點連線的所有的邊,然後找出最短的,選中這條邊加入到生成樹中,列舉每乙個樹頂點到每乙個非樹頂點的所有的邊,然後找最短的邊加入到生成樹,一直加邊n-1次, 直到所有的頂點都被加入到生成樹中。

//索引堆(構造時,可根據引數選擇最大或者最小), 底層基於陣列實現

public class indexminheap

// 從索引堆中取出堆頂元素的索引

public int removeindex()

// 獲取索引堆中的堆頂元素

public e get()

// 獲取索引堆中的堆頂元素的索引

public int getindex()

// 看索引i所在的位置是否存在元素

public boolean contain(int i)

}else

}indexes[j] = ret;

reverse[indexes[j]] = j;

}// 索引堆中, 資料之間的比較根據data的大小進行比較, 但實際操作的是索引

private void shiftdown(int i)

if(items[indexes[i]].compareto(items[indexes[j]])>0)

}int temp = indexes[i];

indexes[i] = indexes[j];

reverse[indexes[i]] = i;

indexes[j] = temp;

reverse[indexes[j]] = j;

i = j;}}

}

//prim演算法 求帶權無向圖的最小生成樹

public class primmstelse if(edgeto[e.otherv(v)].weight().compareto(e.weight())>0)}}

}//prim演算法, 生成最小生成樹

public void prim()

// 計算最小生成樹的權值

for (int i=0; i> mstedges()

//返回最小生成樹的權重和

public number mstweight()

}

//並查集

public class unionfind else}}

//kruskal演算法

public class kruskalmst

public void kruskal()}}

//利用並查集檢查加入一條邊之前,該邊的兩個節點是否已經連線

unionfind uf = new unionfind(graph.v());

while(!pq.isempty() && mst.size()e = pq.remove();

if(uf.isconnected(e.v(), e.w()))

mst.add(e);

uf.unionelements(e.v(), e.w());

}//計算最小生成樹權重

for(int i=0; i> mstedges()

// 返回最小生成樹的權值

資料結構筆記(最小生成樹)

生成樹的代價 設g v,e 是乙個無向連通網,生成樹上各邊的權值之和稱為該生成樹的代價。最小生成樹 在圖g所有生成樹中,代價最小的生成樹稱為最小生成樹。性質 假設g v,e 是乙個無向連通網,u是頂點集v的乙個非空子集。若 u,v 是一條具有最小權值的邊,其中u u,v v u,則必存在一棵包含邊 ...

資料結構 最小生成樹

生成樹 乙個連通圖的最小連通子圖稱作該圖的生成樹。有n個結點的連通圖的生成樹有n個結點和n 1條邊。乙個有n個結點的連通圖的生成樹是原圖的極小連通子圖,它包含原圖中的所有n個結點,並且有保持圖連通的最少的邊。由生成樹的定義可知 若在生成樹中刪除一條邊,就會使該生成樹因變成非連通圖而不再滿足生成樹的定...

資料結構(最小生成樹)

對於乙個無相連通網,他的所有生成樹中必有一棵邊的權值總和最小的生成樹,稱之為最小代價生成樹,簡稱最小生成樹。最小生成樹必須滿足三個條件 1 構造的最小生成樹必須包括n個頂點 2 構造的最小生成樹有且僅有n 1條邊 3 構造的最小生成樹中不存在迴路。普利姆演算法 prim 假設g v,e 為一無向連通...