P4180 BJWC2010 嚴格次小生成樹

2021-10-22 16:45:15 字數 1986 閱讀 9210

題目

最小生成樹都會吧?

不會的戳這裡

接下來我們用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...