noip2013貨車運輸

2021-09-26 19:03:18 字數 1819 閱讀 7387

樹上倍增+最大生成樹

跑一邊kru

sa

lkrusal

krusal

求得最大生成樹。

樹上倍增的時候順帶維護出g[u

][i]

,g[u

][i]

表示u向

上跳2i

步的路徑

中的最小

值g[u][i],g[u][i]表示u向上跳2^i步的路徑中的最小值

g[u][i

],g[

u][i

]表示u

向上跳2

i步的路

徑中的最

小值注意乙個細節問題,在dfs

dfsdf

s時候注意可能不是一棵樹而是幾棵樹,所以我們對重構樹的每個已經遍歷過的點打上標記,再遍歷沒有遍歷過的點

接下來常規操作

rep

(i,0,19

)

#include

#define rep(i,a,b) for(register int (i)=(a);(i)<=(b);(i)++)

#define don(i,a,b) for(register int (i)=(a);(i)>=(b);(i)--)

using

namespace std;

const

int maxn=

1e5+10;

const

int maxm=

1e3+10;

int n,m,q,minn,cnt;

int dep[maxn]

,head[maxn]

,f[maxn][21

],fa[maxn]

,vis[maxn]

,g[maxn][21

];struct

e[maxn<<1]

;struct node

}a[maxn]

;template

<

class

t>

inline

void

read

(t &x)

while

(isdigit

(ch)

) x*

=f;}

void

add(

int u,

int v,

int w)

inline

intfind

(int x)

void

krusal()

}void

readdata()

sort

(a+1

,a+1

+m);

krusal()

;}void

dfs(

int u,

int fa)

for(

int i=head[u]

;i;i=e[i]

.nex)

}inline

intlca

(int x,

int y)

if(x==y)

return minn;

}don

(i,20,0

)}minn=

min(minn,

min(g[x][0

],g[y][0

]));

return minn;

}void

work()

rep(i,

1,q)

}int

main()

noip2013貨車運輸

貨車運輸 truck.cpp c pas 問題描述 a 國有n座城市,編號從1到n,城市之間有 m條雙向道路。每一條道路對車輛都有重 量限制,簡稱限重。現在有 q輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的 情況下,最多能運多重的貨物。輸入 輸入檔名為truck.in。輸入檔案第一行有兩個...

NOIP 2013 貨車運輸

題目描述 description a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。輸入描述 input description 第一行有兩個用乙個...

NOIP 2013 貨車運輸

題目大意 給定一張無向圖 以及若干個詢問 對於每個詢問求所有由節點u到節點v的路徑上邊權的最小值的最大值。題解 首先用構造一棵最大生成樹,這樣保證樹上兩個節點路徑邊權的最小值最大 在最大生成樹上兩個節點之間只有一條路徑,所以只需要找路徑上邊權的最小值 為了快速的尋找最小值,利用樹上倍增的想法用f j...