解法:我們發現,構建乙個最大生成樹,就是最優的運輸方案,可以使用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 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最...