首先,我這一題的思路是倍增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...