传送门

思路:

  二分+最短路径:可以将长度小于等于 mid 的边视为长度为 0 的边,大于 mid 的边视为长度为 1 的边,最后用 dijkstra 检查 d [ n ] 是否小于等于 k 即可。

标程:

#include<cstring>
#include<queue>
#include<cstdio>
#include<iostream>
#include<vector>
#include<fstream>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<stack>
#include<map>
#include<set>
#include<deque>
#include<string>
using namespace std;
#define maxn 100100
#define INF 0x3f3f3f3f
priority_queue<pair< int,int >,vector<pair<int,int> >,greater<pair<int,int > > > q;
struct hh
{
int u,v,w,nex;
}t[maxn<<];
int d[maxn<<],head[maxn<<],jla[maxn<<];//jla记录每条边的边长
int n,m,p,s=,cnt=,ans=INF;//ans记录答案
bool vis[maxn<<];
inline int read()
{
int kr=,xs=;
char ls;
ls=getchar();
while(!isdigit(ls))
{
if(ls=='-')
kr=-;
ls=getchar();
}
while(isdigit(ls))
{
xs=(xs<<)+(xs<<)+(ls^);
ls=getchar();
}
return kr*xs;
}
inline void add(int x,int y,int z)
{
t[++cnt].u=x;
t[cnt].v=y;
t[cnt].w=z;
t[cnt].nex=head[x];
head[x]=cnt;
}//链式前向星加边
inline bool dijkstra(int now)
{
for(int i=;i<=n;i++)
{
d[i]=INF;
vis[i]=false;
}
d[s]=;
q.push(make_pair(d[s],s));
while(!q.empty())
{
int k=q.top().second;
q.pop();
if(vis[k]) continue;
else
{
vis[k]=true;
for(int i=head[k];i!=-;i=t[i].nex)
{
if(t[i].w>now)
if(d[t[i].v]>d[k]+)
{
d[t[i].v]=d[k]+;
q.push(make_pair(d[t[i].v],t[i].v));
}//如果t[i].v的边大于当前二分的答案,那么就要使用一次名额
if(t[i].w<=now)
if(d[t[i].v]>d[k])
{
d[t[i].v]=d[k];
q.push(make_pair(d[t[i].v],t[i].v));
}//如果t[i].v的边不大于当前二分的答案,那么就无需使用名额,直接松弛操作
}
}
}
if(d[n]>p) return false;//如果到达n的次数大于免费的次数限制,那么当前答案不可行
return true;//反之,则可行
}
int main()
{
n=read();m=read();p=read();
for(int i=;i<=n;i++)
head[i]=-;
int xx,yy,zz;
for(int i=;i<=m;i++)
{
xx=read();yy=read();zz=read();
add(xx,yy,zz);
add(yy,xx,zz);
jla[i]=zz;
}
sort(jla+,jla+m+);//将所有的边从小到大排序,为二分做准备
if(dijkstra())
{
printf("0\n");
return ;
}
if(!dijkstra(jla[m]))
{
printf("-1\n");
return ;
}//两个特判,,,
int l=,r=m;
while(l<=r)
{
int mid=l+r>>;//二分查找
if(dijkstra(jla[mid]))
{
ans=min(ans,jla[mid]);
r=mid-;
}
else l=mid+;
}
printf("%d\n",ans);//输出答案
return ;
}

  

P1948 [USACO08JAN]电话线Telephone Lines的更多相关文章

  1. 洛谷 P1948 [USACO08JAN]电话线Telephone Lines

    P1948 [USACO08JAN]电话线Telephone Lines 题目描述 Farmer John wants to set up a telephone line at his farm. ...

  2. 洛谷 P1948 [USACO08JAN]电话线Telephone Lines 题解

    P1948 [USACO08JAN]电话线Telephone Lines 题目描述 Farmer John wants to set up a telephone line at his farm. ...

  3. Luogu P1948 [USACO08JAN]电话线Telephone Lines(最短路+dp)

    P1948 [USACO08JAN]电话线Telephone Lines 题意 题目描述 Farmer John wants to set up a telephone line at his far ...

  4. 洛谷 P1948 [USACO08JAN]电话线Telephone Lines 最短路+二分答案

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1948 [USACO08JAN]电话线Telephone ...

  5. 洛谷P1948 [USACO08JAN]电话线Telephone Lines

    题目描述 Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is u ...

  6. P1948 [USACO08JAN]电话线Telephone Lines(二分答案+最短路)

    思路 考虑题目要求求出最小的第k+1大的边权,想到二分答案 然后二分第k+1大的边权wx 把所有边权<=wx的边权变为0,边权>wx的边权变为0,找出最短路之后,如果dis[T]<= ...

  7. [USACO08JAN]电话线Telephone Lines(分层图)/洛谷P1948

    这道题其实是分层图,但和裸的分层图不太一样.因为它只要求路径总权值为路径上最大一条路径的权值,但仔细考虑,这同时也满足一个贪心的性质,那就是当你每次用路径总权值小的方案来更新,那么可以保证新的路径权值 ...

  8. 题解【洛谷P1948】[USACO08JAN]电话线Telephone Lines

    题面 题解 很显然,答案满足单调性. 因此,可以使用二分答案求解. 考虑\(check\)的实现. 贪心地想,免费的\(k\)对电话线一定都要用上. 每次\(check\)时将小于\(mid\)的边权 ...

  9. [USACO08JAN]电话线Telephone Lines

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

随机推荐

  1. 苹果手机显示分享链接的方法html页面

    function onBridgeReady(){ WeixinJSBridge.call('showOptionMenu'); } if (typeof WeixinJSBridge == &quo ...

  2. How to solve the problem that BMW Icom A2 A3 host can’t be connected?

    Aftre the BMW ICOM host is connected to the car via a 16PIN connector, and the other side is connect ...

  3. json.dumps(),json.loads(),json.dump(),json.load()方法的区别

    1. json.dumps() json.dump()是将字典类型转化成字符串类型. import json dic = {'a':'1111','b':'2222','c':'3333','d':' ...

  4. JS中常见原生DOM操作API

    摘自:https://blog.csdn.net/hj7jay/article/details/53389522 几种对象 Node Node是一个接口,中文叫节点,很多类型的DOM元素都是继承于它, ...

  5. JVM 一套卷,助你快速掌握优化法则

    一:虚拟机内存图解 JAVA 程序运行与虚拟机之上,运行时需要内存空间.虚拟机执行 JAVA 程序的过程中会把它管理的内存划分为不同的数据区域方便管理. 虚拟机管理内存数据区域划分如下图: 数据区域分 ...

  6. 深度估计&平面检测小结

    https://yq.aliyun.com/ziliao/582885 最近一段时间已知忙着赶图像分析与理解的项目,在三个星期内强行接触了CNN,MRF,Caffe,openCV在内的很多东西.现在项 ...

  7. ES6知识整理(2)--变量的解构赋值

    最近准备在业余空闲时间里一边学习ES6,一边整理相关知识.只有整理过的学习才是有效的学习.也就是学习之后要使用和整理成文,才是真正的学到了... 上一篇是一个试水,现在接上. 变量提升 看了下朋友回复 ...

  8. java类中使用quartz,设置自动任务Demo

    package com.tech.jin.jobScheduler; import java.text.ParseException; import java.util.ArrayList; impo ...

  9. oracle parallel_index hint在非分区表的生效

    之前没特别注意,在有些场景下希望使用并行索引扫描的时候,发现parallel_index hint并没有生效,于是抽空看了下文档:The PARALLEL_INDEX hint instructs t ...

  10. sqlloader parallel调用报ORA-26002: table has index defined upon it.解决方法

    ORA-26002: table has index defined upon it. This issue is caused when using the bulk load option in ...