貨車運輸題解 最小生成樹,倍增lca

2021-10-14 09:31:16 字數 2007 閱讀 1593

解法:我們發現,構建乙個最大生成樹,就是最優的運輸方案,可以使用kruskal演算法,通過並查集實現最大生成樹的構建。對於q次詢問,每一次可以通過lca的方法在o(logn)時間內找到答案,如果x,y不在乙個連通分量裡面,輸出-1,否則跑一遍x,y的lca即可。

#include

.h>

using namespace std;

int n, m, q;

struct node edge[

50020];

bool cmp

(const struct node &a,

const struct node &b)

int f[

10010];

int tot =0;

int root =0;

int find

(int x)

void

union

(int x, int y)

}int head[

200010];

int cnt =0;

struct roade[

200010];

void

add(int u, int v, int k)

void

kusk()

for(int i =

1; i <= m; i++

)union

(edge[i]

.u, edge[i]

.v);

add(edge[i]

.u, edge[i]

.v, edge[i]

.val)

;//建立樹

add(edge[i]

.v, edge[i]

.u, edge[i]

.val);if

(++tot == n-1)

}//cout << "ok!\n";

}//用來lca

int fa[

200010][

27];int dep[

200010];

int w[

200010][

27];int vis[

200010];

void

dfs(int u, int d)

}void

build()

}for

(int k =

1; k <=

20; k++)}

//cout << "ok!\n";

}int lca

(int x, int y)

int tx = x, ty = y;

int dx = dep[x]

, dy = dep[y]

; int ans =

1e9+7;

for(int d = dy - dx, i =

0; d; d >>=

1, i++)}

//cout << tx << " " << ty << "\n";

if(tx == ty)

for(int i =

20; i >=

0; i--)}

ans =

min(ans,

min(w[tx][0

], w[ty][0

]));

return ans;

}int main()

sort

(edge+

1, edge+

1+m, cmp)

;memset

(head,-1

, sizeof head)

;kusk()

;build()

; cin >> q;

while

(q--

)else

}return0;

}

LCA NEW 最小生成樹 貨車運輸

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

貨車運輸題解 最大生成樹 lca

2013年noip全國聯賽提高組 時間限制 1 s 空間限制 128000 kb a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。輸入描述 in...

codevs3287貨車運輸(最小生成樹 LCA)

2013年noip全國聯賽提高組 時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最...