P1948 [USACO08JAN]电话线Telephone Lines
传送门
思路:
二分+最短路径:可以将长度小于等于 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的更多相关文章
- 洛谷 P1948 [USACO08JAN]电话线Telephone Lines
P1948 [USACO08JAN]电话线Telephone Lines 题目描述 Farmer John wants to set up a telephone line at his farm. ...
- 洛谷 P1948 [USACO08JAN]电话线Telephone Lines 题解
P1948 [USACO08JAN]电话线Telephone Lines 题目描述 Farmer John wants to set up a telephone line at his farm. ...
- Luogu P1948 [USACO08JAN]电话线Telephone Lines(最短路+dp)
P1948 [USACO08JAN]电话线Telephone Lines 题意 题目描述 Farmer John wants to set up a telephone line at his far ...
- 洛谷 P1948 [USACO08JAN]电话线Telephone Lines 最短路+二分答案
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1948 [USACO08JAN]电话线Telephone ...
- 洛谷P1948 [USACO08JAN]电话线Telephone Lines
题目描述 Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is u ...
- P1948 [USACO08JAN]电话线Telephone Lines(二分答案+最短路)
思路 考虑题目要求求出最小的第k+1大的边权,想到二分答案 然后二分第k+1大的边权wx 把所有边权<=wx的边权变为0,边权>wx的边权变为0,找出最短路之后,如果dis[T]<= ...
- [USACO08JAN]电话线Telephone Lines(分层图)/洛谷P1948
这道题其实是分层图,但和裸的分层图不太一样.因为它只要求路径总权值为路径上最大一条路径的权值,但仔细考虑,这同时也满足一个贪心的性质,那就是当你每次用路径总权值小的方案来更新,那么可以保证新的路径权值 ...
- 题解【洛谷P1948】[USACO08JAN]电话线Telephone Lines
题面 题解 很显然,答案满足单调性. 因此,可以使用二分答案求解. 考虑\(check\)的实现. 贪心地想,免费的\(k\)对电话线一定都要用上. 每次\(check\)时将小于\(mid\)的边权 ...
- [USACO08JAN]电话线Telephone Lines
多年以后,笨笨长大了,成为了电话线布置师.由于地震使得某市的电话线全部损坏,笨笨是负责接到震中市的负责人.该市周围分布着N(1<=N<=1000)根据1……n顺序编号的废弃的电话线杆,任意 ...
随机推荐
- Python+OpenCV图像处理(六)—— ROI与泛洪填充
一.ROI ROI(region of interest),感兴趣区域.机器视觉.图像处理中,从被处理的图像以方框.圆.椭圆.不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI. 代码如下 ...
- TCP协议、算法和原理
TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获. 关于TCP这个协议的细节,我还是推荐你 ...
- vue editorConfig
在文件目录下, indent_size = 2设置为4
- RTSP 与 RTMP 协议 (转)
源: RTMP协议与RTSP协议比较 RTSP 与 RTMP 协议 RTSP Spec中文版(1-11) RTSP协议 流媒体之rtsp篇 H264视频传输.编解码----RTSP协议
- PYQT5 + PYCHARM
PYQT5 C:\Users\xxx\AppData\Local\Programs\Python\Python37\Lib\site-packages\pyqt5_tools\designer.exe ...
- K8S学习笔记之将Google的gcr.io、k8s.gcr.io 换为国内镜像
0x00 添加docker官方的国内镜像 sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ...
- SQLServer和MySql的区别总结
SqlServer支持like '%'+'87'+'%' 拼接字符串 但MySql里不支持,只能用CONCAT('%','87','%')拼接,否则异常 1.递归函数的区别类别表CREATE TAB ...
- maven 新建项目时报错“Could not calculate build plan: Failure to transfer org.apache.maven.plugins:。。。。。。。。。。。。。。”
首先,我们看到观察这个错误:Failure to transfer org.apache.maven.plugins,这种错误是项目部署时,maven所关联的仓库中插件的设置出错了. 所以我们需要找到 ...
- Python3 tkinter基础 Entry state 不可写 可以选 可复制的输入框
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Python3 tkinter基础 Checkbutton anchor for生成多个控件并西对齐
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...