题意描述

在无向图中求一条从 \(1\) 到 \(N\) 的路径,使得路径上第 \(K+1\) 大的边权最小。

等等,最大的最小...如此熟悉的字眼,难道是 二分答案

下面进入正题。

算法分析

没错就是酱紫,二分这个第 \(K+1\) 大的边权的值,设这条边的边权为 \(val\) 那么:

\[ edge[i]=\left\{
\begin{array}{rcl}
0 & & {edge[i] \leq val}\\
1 & & {edge[i] > val}\
\end{array} \right. \]

然后就跑一遍最短路(01 图的最短路可以用双端队列优化来跑)。

\[ find=\left\{
\begin{array}{rcl}
[l,val] & & {dis[N] \leq k}\\
[val+1,r] & & {dis[N] > k}\
\end{array} \right. \]

这样就确定了寻找范围,然后就结束了...

记得初始化时 \(l=-1\),避免误解情况误判。

代码实现

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
#include<deque>
#define N 1010
#define M 10010
using namespace std; int n,p,k,head[N],cnt=0,dis[N];
bool vis[N];
struct Edge{
int next,to,val;
}edge[M<<1];
deque<int>q; int read(){
int x=0,f=1;char c=getchar();
while(c<'0' || c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0' && c<='9') x=x*10+c-48,c=getchar();
return x*f;
} void addedge(int x,int y,int z){
cnt++;
edge[cnt].next=head[x];
edge[cnt].to=y;
edge[cnt].val=z;
head[x]=cnt;
return;
} bool chck(int x){
while(!q.empty()) q.pop_front();
memset(vis,false,sizeof(vis));
memset(dis,0,sizeof(dis));
dis[1]=0;vis[1]=true;
q.push_front(1);
while(!q.empty()){
int now=q.front();
q.pop_front();
for(int i=head[now];i;i=edge[i].next){
int y=edge[i].to;
int z=edge[i].val<=x?0:1;
if(!vis[y] || dis[y]>=dis[now]+1)
if(!z){
dis[y]=dis[now];
q.push_front(y);
vis[y]=true;
}
else{
dis[y]=dis[now]+1;
q.push_back(y);
vis[y]=true;
}
}
}
if(dis[n]<=k) return true;
return false;
} int main(){
n=read();p=read();k=read();
int mx=0,x,y,z;
for(int i=1;i<=p;i++){
x=read();y=read();z=read();
addedge(x,y,z);
addedge(y,x,z);
mx=max(mx,z);
}
int l=-1,r=mx,mid;
while(l<r){
int mid=(l+r)>>1;
if(chck(mid)) r=mid;
else l=mid+1;
}
printf("%d\n",l);
return 0;
}

还是很简单,所以并没有总结。

完结撒花。

P1948 [USACO08JAN]Telephone Lines S的更多相关文章

  1. Luogu P1948 [USACO08JAN]Telephone Lines

    题目 两眼题 二分一个\(lim\),然后跑最短路(边权\(\le lim\)的边长度为\(0\),\(>lim\)的长度为\(1\)),然后判断\(dis_{1,n}\le k\). #inc ...

  2. [USACO08JAN]Telephone Lines

    嘟嘟嘟 题意概括一下,就是在无向图上求一条1到n的路径,使路径上第k + 1大的边权尽量小. 考虑dp,令dp[i][j] 表示走到节点 i,路线上有 j 条电话线免费时,路径上最贵的电缆花费最小是多 ...

  3. POJ3662 [USACO08JAN]Telephone Lines (二分答案/分层图求最短路)

    这道题目有两种解法: 1.将每个点视为一个二元组(x,p),表示从起点到x有p条路径免费,相当于构建了一张分层图,N*k个节点,P*k条边.在这张图上用优先队列优化的SPFA算法求解,注意这里的d数组 ...

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

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

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

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

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

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

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

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

  8. USACO Telephone Lines

    洛谷 P1948 [USACO08JAN]电话线Telephone Lines https://www.luogu.org/problem/P1948 JDOJ 2556: USACO 2008 Ja ...

  9. BZOJ1614: [Usaco2007 Jan]Telephone Lines架设电话线

    1614: [Usaco2007 Jan]Telephone Lines架设电话线 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 892  Solved: ...

随机推荐

  1. Leetcode-递归&分治

    50. Pow(x, n) https://leetcode-cn.com/problems/powx-n/ 实现 pow(x, n) ,即计算 x 的 n 次幂函数. 说明: -100.0 < ...

  2. 【DFIR】数字取证与事件应急响应---初识

    应急响应 适用于负责现场应急,找出可疑的程序,恶意代码的安全工程师.这些可疑恶意程序或代码由另外的专家进行逆向分析. 前言 首先,什么是DRIF? DRIR:Digital Forensics and ...

  3. matlab中find 查找非零元素的索引和值

    来源:https://ww2.mathworks.cn/help/matlab/ref/find.html?searchHighlight=find&s_tid=doc_srchtitle f ...

  4. Linux系统编程 —共享内存之mmap

    共享内存概念 共享内存是通信效率最高的IPC方式,因为进程可以直接读写内存,而无需进行数据的拷备.但是它没有自带同步机制,需要配合信号量等方式来进行同步. 共享内存被创建以后,同一块物理内存被映射到了 ...

  5. [Java 开源项目]一款无需写任何代码,即可一键生成前后端代码的工具

    作者:HelloGitHub-小鱼干 JeecgBoot 是一款基于代码生成器的低代码开发平台,零代码开发.JeecgBoot 采用开发模式:Online Coding 模式-> 代码生成器模式 ...

  6. randomatic

    下载 randomaticrandomatic 使用简单的字符序列生成指定长度的随机字符串.原generate-password. 请考虑下面这个项目的作者,Jon Schlinkert主演的,考虑项 ...

  7. docker容器命令2

    docker容器命令2 启动守护式容器 docker run -d 镜像名字 [root@tzh ~]# docker images REPOSITORY TAG IMAGE ID CREATED S ...

  8. VBScript 教程

    VBScript 教程 VB 不区分大小写 变量 普通变量 关键词声明 Dim.Public.Private 赋值动态创建 name = "hello" Option Explic ...

  9. 53.Qt-QPdfWriter绘制PDF,支持表单输出

    之前打印PDF都是通过html形式来实现的,但是这次要做的东西,需要打印界面控件,所以需要使用QPdfWriter. 通过QPdfWriter来获取QPainter对象,就能实现在PDF上来画画啦. ...

  10. File、Blob、ArrayBuffer等文件类的对象有什么区别和联系

    前言 在前端中处理文件时会经常遇到File.Blob.ArrayBuffer以及相关的处理方法或方式如FileReader.FormData等等这些名词,对于这些常见而又不常见的名词,我相信大多数人对 ...