瘋子的演算法總結11 次小生成樹 嚴格次小生成樹

2022-09-15 06:27:08 字數 953 閱讀 1541

首先,我這一題的思路是倍增lca+kruskal

首先,kruskal求最小生成樹  不會的戳這裡

求次小生成樹 倍增

lca

關鍵在於次小生成樹怎麼求:

問自己一些問題

怎麼求不嚴格次小生成樹

不嚴格次小生成樹為什麼不嚴格

方法每次選擇u—v之間的邊,前提是最小生成樹上不存在的邊,添邊之後刪去較短邊,使用lca找到祖先,刪邊,這裡保證次小生成樹的是?只要添得邊不是u-v在樹上最小距離即可。

模板

#include#include#include#includetypedef long long ll;

using namespace std;

const int m=1e5+100;

ll n,m,res,ans=0x3f3f3f3f,mx;

int f[m],fa[25][m],dep[m];

ll d[2][25][m];

bool used[3*m],vis[m];

vectora[m];

struct edge

}e[3*m];

int f(int x)

void kruskal()

ll get(int u,int v,int c) if(h2&(1else if(d[0][i][v]>m2) m2=d[0][i][v];

else m2=max(m2 , d[1][i][v]);

}} if(m1==c) return c-m2;

else return c-m1;

}int main() return printf("%lld\n",res+ans),0;

總結 嚴格 次小生成樹

首先需要了解什麼是最小生成樹,還要知道什麼是倍增 求lca 上面的東西如果了解了,就可以開始進入學習的路途了 用不是最小生成樹上的邊去更新答案.對於每乙個倍增跳上去的,要維護兩個東西 我們考慮一下對於每一條邊 不在最小生成樹上 如果要把它加入答案,如何更新?mst 路徑最大值 邊權.然後這個東西就可...

次小生成樹(最小生成樹演算法 倍增LCA)

次小生成樹 顯然就是除開最小生成樹外最小的乙個生成樹。非嚴格次小生成樹 權值和 最小生成樹。嚴格次小生成樹 權值和 最小生成樹 求解 每次在非最小生成樹的邊裡找一條,將這條邊加入樹,此時一定形成環,再刪去環中除該邊外最大的一條邊。依次列舉每條邊,找到加入邊 刪除邊最小的一種情況,即可求出非嚴格次小生...

最小生成樹演算法總結

首先,最小生成樹是建立在無向圖中的,對於乙個有n個點的圖,最少需要n 1條邊使得這n個點進行連通,由這n 1條邊組成的子圖稱為原圖的生成樹,乙個圖的生成樹並不是唯一的。最小生成樹則是樹中權值之和最小的一顆生成樹,最小生成樹也可能不唯一。最小生成樹一般有兩種演算法,一種是prim演算法,另一種是kru...