樹上倍增+最大生成樹
跑一邊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...