最小生成樹深入學習

2021-08-15 15:37:46 字數 2331 閱讀 4357

簡稱mst。有兩個方法,kruskal(稀疏圖)與prim(稠密圖)。現給出prim的**:

int a[n][n], d[n], n, m, ans; //a是鄰接矩陣

bool v[n];

inline void prim()

ans = 0;

for(int i = 1; i <= n; ++i) ans+= d[i];

}

與圖論類似,經常會使用二分。

#include #include #include #include #define mo 31011

using namespace std;

struct edge e[1005];

inline bool mycmp(edge x, edge y)

struct node a[105];

int n, m, ans1, fa[105], cnt, score; bool v[1005];

inline int read()

return x;

}inline int getfa(int x) return r;

}inline void mst() ans1+= w;}

}if(score != n - 1) score = -1;

return ;

}inline void mst1()

}if(score != n - 1 || ss != ans1) score = -1;

return ;

}int main()

sort(e+1, e+m+1, mycmp); mapmap; mapmap1;

for(int i = 1; i <= m; ++i)

memset(v, true, sizeof(v)); mst(); int ans = 1;

for(int i = 1; i <= cnt; ++i) {

int d = a[i].d, num = a[i].num, sum = 0, tot = map1[d], st = map[d];

for(int j = 0; j <= (1《看幾道例題。

(一)給定一棵n個節點的樹,要求增加若干條邊,把它擴充為完全圖,並滿足圖中的最小生成樹仍是這棵樹並且唯一。求增加的邊權總和最小是多少。(n ≤ 6000)

給n-1條邊排序,仿照kruskal進行遍歷。我們按照流程,合併x所在的集合與y所在的集合 這兩個集合(並查集)。可知合併完後必為一棵樹(乙個無向連通圖,又無環,當然是樹)。但是呢,我們要形成完全圖,則這兩個集合中的任意兩個元素間都要連邊(除了x與y),於是u到x的路徑,邊u<-->v,邊x<-->y,v到y的路徑就成環了。為了保證邊x<-->y是唯一的連線兩個集合且在mst中的邊,而加的邊又要盡量小,那就全都賦為邊權+1。則答案增加了(num(x所在集合) * num(y所在集合) - 1) * ((x<-->y的邊權) + 1)。

(二)給一無向圖,求最小生成樹。(1號節點度數不超過s,s給定)點數 ≤ 30。

先不去看1號節點,則圖會變成幾個連通塊。dfs劃分出。設一共blank塊連通塊,若blank > s,無解。

對於每個連通塊,求出mst,然後選出一節點p與1號相連(這是能連的邊裡邊權最小的一條邊)。

那麼現在我們得到了1號點度數為blank的最小生成樹。不過呢,既然題目用s去約束,那麼我們可以嘗試著增加度數,即把一些與1號節點無關的邊,替換成一些1號節點發出的邊(使代價盡量小)。

遍歷1發出的所有邊(1,x),它的邊權是val。若(1,x)尚不在mst中,那麼我們找1~x這條路徑上權值最大的邊,它的邊權記為w吧(這裡和上一道題有點類似,也是構成了簡單環,這樣我們就可以在這個環中把代價較大的刪掉了)。找到使w-val最大的那個點,把它更新。(打擂台,貪心思想)

迴圈的做s - blank次。若有一次發現最大的w - val居然≤0了,break。

由此我們可以看出,不停利用:每乙個小的簡單環中具有對稱性,把最大邊棄掉的思想是十分重要的。

(三)最短路徑生成樹問題

乙個無向圖,生成樹之後要滿足,任意一點與1號間的距離與在圖中時候的距離都一樣(即單源最短路dis值等於生成樹中從根節點(當然把1號作為根節點咯)到自己的距離(直接就能dfs出來))。問有多少種生成方法?

對於樹中能組成父子的節點對x,y(x是父親),必須要滿足dis[y] = dis[x] + val(x->y)。所以我們列舉這樣的點對,他們就一定可以構成滿足條件的生成樹的一條樹枝。

然後乘法原理,得出答案。(怎麼乘我也不知道!!!但是由於這樣的點集都是有序的,個人感覺可以treedp一下)

最後,祝大家情人節快樂,也預祝新年快樂!

有物件的長長久久~ 還沒有的會盡快遇到陪你一輩子的人~ 

謝謝大家支援

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

最小生成樹學習總結

a.問題描述 實際生活中,我們總須找到最優的情況,如修建道路怎樣才最省錢。我們可以將實際問題看成一張圖,要滿足我們的需求,這張圖有很多種方案,我們要找出對我們來說最優的乙個方案,其他的方案都放棄。那問題就轉化成怎樣構建一顆最小的的樹了。實現方法有兩種 1.kruskal演算法 以邊為選擇物件,選擇過...

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...