【Codeforces Testing Round #2】 Codeforces 125E MST Company

本文探讨了Codeforces中一个关于最小生成树(MST)的竞赛题目,公司需修复n个城市间的道路,确保通过k条首都道路连接所有城市,并使总长度最小。首先使用Kruskal算法构建不含首都的MST,然后逐步添加与首都相连的边,每次添加后寻找环上最长边并更新增量。解决方案涉及单点k度MST问题,通过最小增量策略优化路径总长度。
摘要由CSDN通过智能技术生成

The MST (Meaningless State Team) company won another tender for an
important state reform in Berland.

There are n cities in Berland, some pairs of the cities are connected
by roads. Each road has its price. One can move along any road in any
direction. The MST team should carry out the repair works on some set
of roads such that one can get from any city to any other one moving
only along the repaired roads. Moreover, this set should contain
exactly k capital roads (that is, the roads that start or finish in
the capital). The number of the capital is 1.

As the budget has already been approved, the MST Company will profit
by finding the set with minimum lengths of roads.

Input The first input line contains three integers n, m, k
(1 ≤ n ≤ 5000;0 ≤ m ≤ 105;0 ≤ k < 5000), where n is the number of
cities in the country, m is the number of roads in the country, k is
the number of capital roads in the required set. Then m lines
enumerate the roads in question. Each road is specified by three
numbers ai, bi, wi (1 ≤ ai, bi ≤ n; 1 ≤ w ≤ 105), where ai, bi are the
numbers of cities linked by a road and wi is its length.

Between each pair of cities no more than one road exists. There are no
roads that start and finish in one city. The capital’s number is 1.

Output In the first line print the number of roads in the required
set. The second line should contain the numbers of roads included in
the sought set. If the sought set does not exist, print -1.

经典的单点k度MST问题。
先用kruskal求出不含1的MST,应该是(除1以外)多个联通块。这样的话点1的度数至少是联通块个数,如果k不到,那么一定无解。否则先用边权最小的边连通起来,然后每次增加一条与1相连的边。加边以后会产生一个环,找到环上的最长边,就可以算出添加这条边的增量。每次选择增量最小的即可。
如何找到最长边?只要每次从1开始dfs一遍算出1到每个节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值