题目大意:

一共有N (1 ≤ N ≤ 1,000)个电线杆,有P P (1 ≤ P ≤ 10,000)对电线杆是可以连接的,

用几条线连接在一起的电线杆之间都可相互通信,现在想要使得电线杆1和电线杆N能相互通信,

并且电线公司提出KK (0 ≤ K < N)条电线是可以免费使用的,

当使用电线的数量超过K条,超出的电线要收费,

收的总费用为去掉免费使用的K条电线之后最长的那条电线的长度。

问最少费用是多少

Input

* Line 1: Three space-separated integers: NP, and K

* Lines 2..P+1: Line i+1 contains the three space-separated integers: AiBi, and Li

Output

Line 1: A single integer, the minimum amount Farmer John can pay. If it is impossible to connect the farm to the phone company, print -1.

Sample Input

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

Sample Output

4

/*
这题二分猜测答案 用最短路dijkstra验证 验证 猜测的mid是1~N的最短路中第k+1大的花费
用dis[i]记录1到i点时 花费>= mid 的顶点数 //若1~N没有路 则dis[n]始终为初始值INF
//则二分猜测的答案始终正确 最终二分会被推到最右的点
即无路 输出-1 //若1~N有路但小于k+1条 则dis[n]始终<k+1
//则二分猜测的答案始终错误 最终二分会被推到最左的点
即无花费 输出0 */ #include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
struct NODE
{ /// 要放在vector里 需要重载小于号 按 val即花费 升序排序
int to,val; // 到to点 花费val
bool operator<(const NODE& x) const
{ return val < x.val; }
};
vector <NODE> vec[];
int n,p,k,vis[],dis[];
bool dijk(int mid)
{
for(int i=;i<=n;i++)
vis[i]=, dis[i]=INF; priority_queue <NODE> q; ///优先队列自动升序排序
NODE e; e.to=,e.val=;
q.push(e); dis[]=; while(!q.empty())
{
e=q.top(); q.pop();
vis[e.to]=;
vector <NODE> ::iterator it;
for(it=vec[e.to].begin();it!=vec[e.to].end();it++)
{
NODE tmp=*it;
if(vis[tmp.to]) continue;
int nowv=dis[e.to]+ (tmp.val>=mid ? :);
/// tmp.val>=mid的话 说明在这条路上 到顶点tmp.to的路大于猜测值
/// 则dis[该点]为dis[上一点]+1 否则+0 先用nowv记录 /// 与答案mid相等的也记录下来 若mid为正确答案 则恰好为第k+1个
/// 可能有多个花费等于mid 所以判断dis[n]>=k+1 if(dis[tmp.to]>nowv)
{/// 之前记录过的比nowv大 说明nowv所在的这条才是较短的路
dis[tmp.to]=nowv;
vis[tmp.to]=;
q.push(tmp);
}
}
}
//printf("%d\n",dis[n]);
return dis[n]>=k+;
}
int main()
{
while(~scanf("%d%d%d",&n,&p,&k))
{
for(int i=;i<=n;i++)
vec[i].clear(); NODE e;
while(p--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
e.to=b, e.val=c;
vec[a].push_back(e);
e.to=a, e.val=c;
vec[b].push_back(e);/// 无向图邻接表
} int le=,rig=,ans=-;
while(le<=rig)
{// 二分答案 mid为猜测值 进入dijk()验证 mid是不是第k+1条路
int mid=(le+rig)/;
if(spfa(mid)) le=mid+, ans=mid; ///mid在k个之后(太小或恰好)
else rig=mid-; ///mid在k个之内(太大) 缩小范围继续验证
}
if(ans>) ans=-; /// 说明dis[n] 一直在k个之后
if(rig<) ans=; /// 说明dis[n] 一直在k个之内
printf("%d\n",ans);
} return ;
}

USACO 2008 January Silver Telephone Lines /// 二分最短路 邻接表dijkstra oj22924的更多相关文章

  1. POJ 3662 Telephone Lines(二分+最短路)

    查看题目 最小化第K大值. 让我怀疑人生的一题目,我有这么笨? #include <cstdio> #include <queue> #include <cstring& ...

  2. poj3662 Telephone Lines【最短路】【二分】

    http://poj.org/problem?id=3662 Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  3. poj 3662 Telephone Lines(最短路+二分)

    Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6973   Accepted: 2554 D ...

  4. [USACO 2008 Jan. Silver]架设电话线 —— 最短路+二分

    一道图论的最短路题.一开始连最短路都没想到,可能是做的题太少了吧,完全没有思路. 题目大意: FJ的农场周围分布着N根电话线杆,任意两根电话线杆间都没有电话线相连.一共P对电话线杆间可以拉电话线,第i ...

  5. poj-3662 Telephone Lines 二分答案+最短路

    链接:洛谷 POJ 题目描述 Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone co ...

  6. POJ 3662 Telephone Lines (二分+Dijkstra: 最小化第k大的值)

    题意 Farmer John想从电话公司修一些电缆连接到他农场.已知N个电线杆编号为1,2,⋯N,其中1号已经连接电话公司,N号为农场,有P对电线杆可连接. 现给出P对电线杆距离Ai,Bi,Li表示A ...

  7. POJ 3662 Telephone Lines (二分+dijkstra)

    题意: 多年以后,笨笨长大了,成为了电话线布置师.由于地震使得某市的电话线全部损坏,笨笨是负责接到震中市的负责人. 该市周围分布着N(1<=N<=1000)根据1……n顺序编号的废弃的电话 ...

  8. POJ-3662 Telephone Lines 二分+双端队列

    题目传送门 题意:有n个点, p条路,每条道路有个花费Li, 然后现在要建一条1-n的路线,然后可以选k条道路免费, 然后可以在剩下的道路中选择价格最高的边支付费用, 求这个答案最小. 题解: 二分答 ...

  9. USACO 2008 Mar Silver 3.River Crossing 动态规划水题

    Code: #include<cstring> #include<algorithm> #include<cstdio> using namespace std; ...

随机推荐

  1. Codeforces 340B - Maximal Area Quadrilateral (计算几何)

    Codeforces Round #198 (Div. 2) 题目链接:Maximal Area Quadrilateral Iahub has drawn a set of \(n\) points ...

  2. mkdir无法创建目录权限不够

    https://idc.wanyunshuju.com/cym/40.html 由于在公司服务器上权限问题比较复杂,我们解决这个问题是寻求服务器端人员的意见.让他们授予权限/.

  3. C# 简单的往txt中写日志,调试时很有用

    原文 http://blog.csdn.net/hejialin666/article/details/6106648 有些程序在调试时很难抓住断点(如服务程序),有些程序需要循环无数次,要看每一次或 ...

  4. python调用tushare获取IPO新股上市列表数据

    接口:new_share 描述:获取新股上市列表数据 限量:单次最大2000条,总量不限制 积分:用户需要至少120积分才可以调取,具体请参阅本文最下方积分获取办法 注:tushare包下载和初始化教 ...

  5. 【转】深入理解Linux修改hostname

    当我觉得对Linux系统下修改hostname已经非常熟悉的时候,今天碰到了几个个问题,这几个问题给我好好上了一课,很多知识点,当你觉得你已经掌握的时候,其实你了解的还只是皮毛.技术活,切勿浅尝则止! ...

  6. vue中wath的源码实现

    前言 阅读本节,需要理解vue的数据驱动原理. 看这样一段代码 new Vue({ data: { msg: 'hello', say: 'hello world', }, watch: { msg( ...

  7. SDL系列之 - 用SDL动态地画一个圆喽 && 设置背景色

    #include <SDL.h> #include <stdlib.h> #include <string.h> #include <math.h> # ...

  8. eclipse 在复制/粘贴 时很卡(转)

    最近发现eclipse在按Ctrl+C 时卡的要命,在网上找了一下,发现原来如此: 打开选项: Window -> Preferences -> General -> Editors ...

  9. wall -- 向所有人的终端发送消息

    总览 (SYNOPSIS) wall [ message ] 描述 (DESCRIPTION) Wall 向 所有 登录的 并且 mesg(1) 权限 设为 yes 的 用户 发送 消息. 消息可以 ...

  10. 笔记:Python的浅复制和深复制

    方法copy返回一个新字典,其包含的键-值对与原来的字典相同(这个方法执行的是浅复制,因为值本身是原件,而不是副本). >>> x = {"username": ...