一本通1555 例 4 次小生成樹

2022-05-08 02:03:11 字數 1889 閱讀 4755

時間限制: 1000 ms         記憶體限制: 524288 kb

題目描述

原題來自:beijing 2010 組隊賽

給定一張 n 個點 m 條邊的無向圖,求無向圖的嚴格次小生成樹。

設最小生成樹的邊權之和為 sum,嚴格次小生成樹就是指邊權之和大於 sum 的生成樹中最小的乙個。

輸入格式

第一行包含兩個整數 n 和 m,表示無向圖的點數與邊數;

接下來 mm 行,每行三個數 x,y,z,表示點 x 和點 y 之間有一條邊,邊的權值為 z。

輸出格式

包含一行,僅乙個數,表示嚴格次小生成樹的邊權和。

資料保證必定存在嚴格次小生成樹。

樣例樣例輸入

5 6 

1 2 1

1 3 2

2 4 3

3 5 4

3 4 3

4 5 6

樣例輸出

11
資料範圍與提示

對於全部資料,1≤n≤10^5,1≤m≤3×10^5,資料中無向圖無自環,邊權值非負且不超過 10^9。

sol:嚴格次小生成樹模板,我使用倍增做的,樹剖也可以(表示不清楚別人為什麼這麼快)

#include using

namespace

std;

const

int n=100005,m=300005,inf=0x3f3f3f3f

;int

n,m;

struct

edge

e[m];

inline

bool

cmp(edge p,edge q)

intfather[n];

long

long mst=0

;bool

edge_bo[m];

inline

int get_father(int

x)struct

tree

int depth[n],f[n][23

];

int val_zd[n][23],val_cd[n][23

]; inline

void dfs(int x,int

fa)

return

; }

inline

void

pre()

}return

; }

inline

int ask_lca(int x,int

y)

inline

int ask_lower(int x,int y,int

z)

return

ans;

}}t;int

main()

; }

sort(e+1,e+m+1

,cmp);

for(i=1;i<=m;i++)

//printf("mst=%d\n",mst);

t.pre();

long

long ans=0x7ffffffffff

;

for(i=1;i<=m;i++) if(!edge_bo[i])

printf(

"%lld\n

",ans);

return0;

}/*input

5 6

1 2 1

1 3 2

2 4 3

3 5 4

3 4 3

4 5 6

output

11*/

view code

一本通1600 例 4 旅行問題

時間限制 1000 ms 記憶體限制 524288 kb 原題來自 poi 2004 john 打算駕駛一輛汽車周遊乙個環形公路。公路上總共有 n n 車站,每站都有若干公升汽油 有的站可能油量為零 每公升油可以讓汽車行駛一千公尺。john 必須從某個車站出發,一直按順時針 或逆時針 方向走遍所有的...

一本通 1 1 例 4 加工生產排程

題目傳送門 這道題是johnson雙流水線排程演算法的基礎題。本題是要求乙個加工順序使得總的加工時間最少,而要使加工時間最少,就是讓各車間的空閒時間最少。一旦a車間開始加工,便會不停地進行加工 我們不要去管車間是否能夠一直生產,因為他們有三班,可以24時間不停地運轉 關鍵是b車間在生產的過程中,有可...

一本通 1 1 例 2 種樹

題目傳送門 這題的題目問的是要滿足所有居民的建議,至少要種多少棵樹。對於這種題目,我們首先想到的應該是貪心策略。貪心策略 首先按右端點從小到大排序,因為要求樹最少,所以要盡量放在右端點。然後定義乙個bool陣列判斷該點是否種過樹即可。從右端點開始種,可以讓更多的樹照顧到更右側的端點,這樣就能使種的數...