題目
最小生成樹都會吧?
不會的戳這裡
接下來我們用lca求每一條非樹邊在樹上環的最大邊權和次大邊權,然後求乙個min(s-mx+v,s-mx2+v,mn)就可以了,注意如果mx=v,第一項不比較.
code:
#include
#include
#include
#include
#include
#include
using
namespace std;
long
long fa[
100010][
22],v[100010][
22][2
],head[
500010
],c[
500010
],x,y,f[
100010];
long
long n,m,s;
struct f a[
600020];
struct pvz z[
300010];
long
long k;
bool
cmp(pvz x,pvz y)
long
long
find
(long
long x)
void
add(
long
long u,
long
long v,
long
long z)
voiddk(
)}return;}
void
dfs(
long
long x,
long
long f,
long
long g)
for(
long
long i=head[x]
;i!=-1
;i=a[i]
.net)
return;}
long
long mn=
2147483647000000
;long
long
lca(
long
long x,
long
long y,
long
long z)}if
(x!=y)}}
mx1=
max(mx1,v[x][0
][0]
);mx2=
max(mx2,v[x][0
][1]
);if(mx1!=v[x][0
][0]
) mx2=
max(mx2,v[x][0
][0]
);mx1=
max(mx1,v[y][0
][0]
);mx2=
max(mx2,v[y][0
][1]
);if(mx1!=v[y][0
][0]
) mx2=
max(mx2,v[y][0
][0]
);if(z==mx1) mn=
min(mn,s-mx2+z);if
(z>mx1) mn=
min(mn,s-mx1+z)
;return
(x!=y?fa[x][0
]:x);}
intmain()
}sort
(z+1
,z+1
+m,cmp);dk
();dfs(1
,0,0
);for(
long
long i=
1;i<=m;i++
) cout
}
P4180 嚴格次小生成樹 BJWC2010
題目鏈結 當時在暑假早就講了這道題了,只不過我現在才做了這道題。題解 我們要求次小生成樹的話,考慮先把最小生成樹求出來,因為如果我們用求最小生成樹的話,邊早已經從大到小排序好了,所以次小生成樹的就是替換最小生成樹上的一條邊所得。那麼考慮如何來替換那一條邊,要保證嚴格次小,那麼我們需要替換掉最小生成樹...
嚴格次小生成樹 BJWC2010
原文必點 原題鏈結 給定一張 n 個點 m 條邊的無向圖,求無向圖的嚴格次小生成樹。設最小生成樹的邊權之和為 sum 嚴格次小生成樹就是指邊權之和大於 sum 的生成樹中最小的乙個。輸入格式 第一行包含兩個整數 n 和 m 接下來 m 行,每行包含三個整數 x,y,z 表示點 x 和點 y 之前存在...
BJWC2010 嚴格次小生成樹
板子題 先kruskal得到最小生成樹,再列舉未加進生成樹中的邊i,該邊i和生成樹樹形成了乙個環,選擇這個環上最大的不等於i的權值的邊去掉就得到乙個新的樹,所有這樣得到的樹權值之和即為次小生成樹。求環上最大邊可以用倍增或者樹鏈剖分,由於最大邊可能和才加上去的邊相等,所以還要維護乙個次大邊 inclu...