//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 為一無向連通...