BJWC2010 嚴格次小生成樹

2022-03-17 01:57:52 字數 942 閱讀 5698

板子題

先kruskal得到最小生成樹,再列舉未加進生成樹中的邊i,該邊i和生成樹樹形成了乙個環,選擇這個環上最大的不等於i的權值的邊去掉就得到乙個新的樹,所有這樣得到的樹權值之和即為次小生成樹。

求環上最大邊可以用倍增或者樹鏈剖分,由於最大邊可能和才加上去的邊相等,所以還要維護乙個次大邊

#include#define n 100005

#define m 300005

using namespace std;

typedef long long ll;

const ll inf = 10000000000000000;

int n,m,fa[n],f[n][20],dep[n];

bool vis[m];

ll maxx[n][20],naxx[n][20],ans,minn;

struct e e[m];

struct edge edge[m<<1];

int head[n],cnt=1;

void add_edge(int from,int to,ll dis)

template void read(t &x)

bool cmp(e a,e b)

} if(x==y) return ret;

for(int i=19;i>=0;--i) }

if(maxx[x][0]!=max) ret=max(ret,maxx[x][0]); else ret=max(ret,naxx[x][0]);

if(maxx[y][0]!=max) ret=max(ret,maxx[y][0]); else ret=max(ret,naxx[y][0]);

return ret;

}int main()

cout

}

嚴格次小生成樹 BJWC2010

原文必點 原題鏈結 給定一張 n 個點 m 條邊的無向圖,求無向圖的嚴格次小生成樹。設最小生成樹的邊權之和為 sum 嚴格次小生成樹就是指邊權之和大於 sum 的生成樹中最小的乙個。輸入格式 第一行包含兩個整數 n 和 m 接下來 m 行,每行包含三個整數 x,y,z 表示點 x 和點 y 之前存在...

P4180 嚴格次小生成樹 BJWC2010

題目鏈結 當時在暑假早就講了這道題了,只不過我現在才做了這道題。題解 我們要求次小生成樹的話,考慮先把最小生成樹求出來,因為如果我們用求最小生成樹的話,邊早已經從大到小排序好了,所以次小生成樹的就是替換最小生成樹上的一條邊所得。那麼考慮如何來替換那一條邊,要保證嚴格次小,那麼我們需要替換掉最小生成樹...

P4180 BJWC2010 嚴格次小生成樹

題目 最小生成樹都會吧?不會的戳這裡 接下來我們用lca求每一條非樹邊在樹上環的最大邊權和次大邊權,然後求乙個min s mx v,s mx2 v,mn 就可以了,注意如果mx v,第一項不比較.code include include include include include include...