其实是和奥格瑞玛一样的题啦。

但还是想了很久后看了题解。

多年以后,笨笨长大了,成为了电话线布置师。由于地震使得某市的电话线全部损坏,笨笨是负责接到震中市的负责人。该市周围分布着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.

请你计算一下,将电话线引导震中市最少需要在电话线上花多少钱?如果无解,输出-1。

输入输出格式

输入格式:

输入文件的第一行包含三个数字n,p,k;

第二行到第p+1行,每行分别都为三个整数ai,bi,li。

输出格式:

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

题设:最长的电话线花费最少是多少 。

同样是一道二分答案。

我们仿照上一题,二分最后的花费(最长电话线的长度)。

但是这题比较 特别的是电信(移动)公司会免费提供k条线路。这个条件怎么用?因为是免费的,所以我们肯定贪心地想要先把这几条线路用在比当前二分出的答案长的道路上,把钱花在刀刃上嘛。这个思想怎么实现?我们可以在每次的spfacheck中把比当前答案大的边设为1,比当前长度小的答案设为0.,于是我们就成功地重载了dis数组的含义,他不再表示最短路程长度,而是用了优惠的边的个数。

其他注意事项:左边界为0(因为题目中说有不超过k对的情况),连两次边。

难点:转化dis数组的含义,利用免费搭建k对的条件。
code

 #include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring> using namespace std;
const int inf=0x7f7f7f7f; int n,p,k,tot,mx,s;
int head[],visit[],dis[];
struct node{
int to,next,val;
}edge[]; void add(int x,int y,int z)
{
edge[++tot].to=y;
edge[tot].val=z;
edge[tot].next=head[x];
head[x]=tot;
} bool spfa_check(int cnt)
{
memset(visit,,sizeof(visit));
for(int i=;i<=n;i++) dis[i]=inf;
queue<int>q;
dis[]=;visit[]=;q.push();
while(!q.empty())
{
int x=q.front();
q.pop();visit[x]=;
for(int i=head[x];i;i=edge[i].next)
{
int y=edge[i].to;
if(edge[i].val>cnt) s=dis[x]+;
else s=dis[x];
if(s<dis[y])
{
dis[y]=s;
if(!visit[y])
{
visit[y]=;
q.push(y);
}
}
}
}
if(dis[n]<=k) return ;
return ;
} int main()
{
scanf("%d%d%d",&n,&p,&k);
for(int i=;i<=p;i++)
{
int u=,v=,w=;
scanf("%d%d%d",&u,&v,&w);
mx=max(mx,w);
add(u,v,w);
add(v,u,w);
}
int l=,r=mx;
if(!spfa_check(r))
{
printf("-1");
return ;
}
while(l<r)
{
int mid=(l+r)>>;
if(spfa_check(mid)) r=mid;
else l=mid+;
}
printf("%d",l);
return ;
}

最新文章

  1. Hololens开发笔记之连接PC实现资源共享
  2. Block的用法
  3. centos 非可视化查看已安装的redis
  4. jdbcTemplate queryForObject 查询 结果集 数量
  5. MySQL的分页
  6. P137、面试题23:从上往下打印二叉树
  7. perl 对象 通过bless实现
  8. mysql管理 ------查看 MySQL 数据库中每个表占用的空间大小
  9. git的安装(和远程仓库建立连接)
  10. .net程序员面试小结(内附一些面试题和答案)
  11. easyui 传递参数报错(错误:uncaught SyntaxError: Unexpected identifier)
  12. Selenuim自动化测试模型
  13. Kotlin中构造方法的参数var val 和 什么都没有的区别
  14. Linux内核原理第八次作业
  15. JDK10源码阅读--String
  16. python import 其他 package的模块
  17. Linux(Debian)软件安装
  18. as3 air 保存文本内容的换行
  19. Scrapy命令行工具简介
  20. Public Bike Management (30)(DFS,VRCTOR,模拟)(PAT甲级)

热门文章

  1. 洛谷 P2862 [USACO06JAN]把牛Corral the Cows
  2. TList实现的任务队列
  3. DRBD+Heratbeat+NFS高可用文件共享存储
  4. [Rust] Setup Rust for WebAssembly
  5. [Angular] Architectures for Huge Angular Based Enterprise
  6. LeetCode 283 Move Zeroes(移动全部的零元素)
  7. Android学习路线(十九)支持不同设备——支持不同(Android)平台版本号
  8. 使用7zip压解各种文件的经常使用命令
  9. PHP出现Warning: A non-numeric value encountered问题的原因及解决方法
  10. 图像处理之基础---很好的一个快速比较两副图片是否相同的code 可用于公安鉴别