洛谷 1948 笨笨的电话网络

这道题目是关于在一个受损的电话网络中,如何以最低成本连接1号和N号电线杆。电信公司提供k对免费连接,其他超出的连接根据最长线缆费用计算。解决方案包括二分查找结合SPFA验证法和分层图SPFA算法。通过这两种方法可以找到最小支出。
摘要由CSDN通过智能技术生成

题目描述 Description

多年以后,笨笨长大了,成为了电话线布置师。由于地震使得某市的电话线全部损坏,笨笨是负责接到震中市的负责人。该市周围分布着N(1<=N<=1000)根据1……n顺序编号的废弃的电话线杆,任意两根线杆之间没有电话线连接,一共有p(1<=p<=10000)对电话杆可以拉电话线。其他的由于地震使得无法连接。
第i对电线杆的两个端点分别是ai,bi,它们的距离为li(1<=li<=1000000)。数据中每对(ai,bi)只出现一次。编号为1的电话杆已经接入了全国的电话网络,整个市的电话线全都连到了编号N的电话线杆上。也就是说,笨笨的任务仅仅是找一条将1号和N号电线杆连起来的路径,其余的电话杆并不一定要连入电话网络。
电信公司决定支援灾区免费为此市连接k对由笨笨指定的电话线杆,对于此外的那些电话线,需要为它们付费,总费用决定于其中最长的电话线的长度(每根电话线仅连接一对电话线杆)。如果需要连接的电话线杆不超过k对,那么支出为0.
请你计算一下,将电话线引导震中市最少需要在电话线上花多少钱?

输入格式:

输入文件的第一行包含三个数字n,p,k;
第二行到第p+1行,每行分别都为三个整数ai,bi,li。

输出格式:

一个整数,表示该项工程的最小支出,如果不可能完成则输出-1.

输入样例:

5 7 1
1 2 5
3 1 4
2 4 8
3 2 3
5 2 9
3 4 7
4 5 6

输出样例:

4

这题有两种做法,按出题人的想法应该是二分+spfa验证,然而因为k数值较小,可以跑一次分层图的spfa水过去233。
二分+spfa验证:
二分最少在电话线上花的钱 mid,遍历一遍边,边的权值大于mid,就把权值设为 1,其余设为 0,然后从起点跑最短路,这时到终点的最短路的意义是连接 1 到 n 需要花 dist[n] 对超过 mid 花费的电线,显然,dist[n] 超过 k 时二分的答案是不科学的,借这个判断就好了。
分层图:
把dist数组开成二维,利用dp的思想dist[i][j] 表示用了 j 次免费的机会到 连接到 i 点的最大值spfa松弛操作时有两种选择:用或不用免费机会 , 当然用的话一定要当前使用次数 < k 才好。

二分 + spfa验证代码:

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int size = 200010;
int head[size],next[size],dist[size];
bool use[size];
int dis[size],rr[size];
int n,p,k;
struct dc
{
    int t,d;
} l[size];
int tot = 1;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值