NOIP2013 貨車運輸

2022-05-09 14:15:08 字數 1855 閱讀 4495

嘟嘟嘟

首先,每一輛貨車路徑唯一,說明應該求生成樹。又要滿足這條路的最小邊權最大,進一步得出要求最大生成樹。

求完最大生成樹上要解決的是樹上任意兩點之間的邊權的最小值,我第一反應是樹剖維護鏈上最小值,但其實我們用lca就可以了:對於任意兩點x, y, 維護x到lca(x, y)和y到lca(x, y)這兩條鏈上的最小值。時間複雜度o(nlogn)。

還有幾點要注意:

1.圖並不連通,所以對於每乙個沒遍歷過的點都要跑一遍lca。

2.好像沒啦。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11

using

namespace

std;

12#define enter puts("")

13#define space putchar(' ')

14#define mem(a, x) memset(a, x, sizeof(a))

15#define rg register

16 typedef long

long

ll;17 typedef double

db;18

const

int inf = 0x3f3f3f3f;19

const db eps = 1e-8;20

const

int maxn = 1e5 + 5;21

inline ll read()

2226

while(isdigit(ch))

27if(last == '

-') ans = -ans;

28return

ans;29}

30 inline void

write(ll x)

3136

37int

n, m, q;

38 vectorv[maxn], c[maxn];

39struct

edge

4046 }e[maxn * 5

];47

48int

p[maxn];

49void init(int

n)50

53int find(int

x)54

5758

bool

vis[maxn];

59int dep[maxn], fa[maxn][21], min[maxn][21

];60

void dfs(int

now)

6168

for(int i = 0; i < (int)v[now].size(); ++i)

6977}78

}79int lca(int x, int

y)80

90if(x == y) return

ret;

91for(int i = 20; i >= 0; --i)

9299

}100

return min(ret, min(min[x][0], min[y][0

]));

101}

102103

intmain()

104119

}120

for(int i = 1; i <= n; ++i) if(!vis[i]) dfs(i);

121 q =read();

122for(int i = 1; i <= q; ++i)

123128

return0;

129 }

view code

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...