我在几个小时内尝试了以下问题,但无法获得正确的逻辑。
你是一个负责铺设的规划团队 一个辅助电网。这个目的 辅助电网是为连接点上的灯柱供电 在停电的情况下的一个小镇。你的团队是 给k发电机。你可以放置这些发电机 网格中的任何位置,每个发电机都可以打开 所有通过电网连接的灯 (存在路径)。对于镇上的每条道路,你都是 考虑到在电网中铺设电缆以连接两者的成本 该路的终点处的交叉点。鉴于镇的布局, 你的任务是放下最低成本网格并安装 它上面的发电机,你可以打开所有的灯柱 镇的交界处。
输入: 第一行包含案例数t。然后,t案件随之而来。 每种情况的第一行包含三个整数n,m和k。 结点编号为1到n。然后,m行跟随。 每行包含三个整数i,j,c。整数i和j 在1和n之间,表示道路两个端点处的两个交叉点。 第三个整数c是成本 在这条路上铺设电缆。
输出: 你应该输出t行,每种情况一行。对于每种情况输出 最低成本网格。如果这项任务是不可能的(即没有办法 用k发电机打开所有灯), 输出“不可能!” (为清晰起见,引号)
Constraints:
1 <= t <= 25
1 <= n <= 2000
0 <= m <= n(n-1)/2
0 <= c <= 1000000
Sample Input:
2
3 1 1
1 2 10
6 7 2
1 2 20
1 3 5
1 4 10
2 3 8
2 4 15
3 4 2
5 6 9
Sample Output:
Impossible!
24
说明: 在第一种情况下,连接点1和2断开连接 3号交叉口,你不能只打开所有的灯柱 一台发电机。你需要至少两台发电机。在第二种情况下, 你可以在道路上放置电缆(1 3),(2 3),(3 4)和(5 6)然后 在1号交叉口安装一台发电机,在5号交叉口安装一台发电机。
如何有效地解决这个问题?现在我不知道除了BruteForce之外。 修改后的Kruskal会在这里工作吗?
答案 0 :(得分:2)
您需要的解决方案是断开连接的生成树的集合。如果您没有在解决方案中使用所有行并给它们相同的非常大的成本,那么您可以找到最小生成树并丢弃具有非常高成本的行来找到解决方案。
这显然是不可能的,但Kruskal的算法是以最低成本的边缘开始并按照稳定增加的成本继续进行。因此,如果您在断开组件时停止它,您将获得与完成此操作相同的答案。