P1948 [USACO08JAN]Telephone Lines S
题意描述
在无向图中求一条从 \(1\) 到 \(N\) 的路径,使得路径上第 \(K+1\) 大的边权最小。
等等,最大的最小...如此熟悉的字眼,难道是 二分答案。
下面进入正题。
算法分析
没错就是酱紫,二分这个第 \(K+1\) 大的边权的值,设这条边的边权为 \(val\) 那么:
\begin{array}{rcl}
0 & & {edge[i] \leq val}\\
1 & & {edge[i] > val}\
\end{array} \right. \]
然后就跑一遍最短路(01 图的最短路可以用双端队列优化来跑)。
\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的更多相关文章
- Luogu P1948 [USACO08JAN]Telephone Lines
题目 两眼题 二分一个\(lim\),然后跑最短路(边权\(\le lim\)的边长度为\(0\),\(>lim\)的长度为\(1\)),然后判断\(dis_{1,n}\le k\). #inc ...
- [USACO08JAN]Telephone Lines
嘟嘟嘟 题意概括一下,就是在无向图上求一条1到n的路径,使路径上第k + 1大的边权尽量小. 考虑dp,令dp[i][j] 表示走到节点 i,路线上有 j 条电话线免费时,路径上最贵的电缆花费最小是多 ...
- POJ3662 [USACO08JAN]Telephone Lines (二分答案/分层图求最短路)
这道题目有两种解法: 1.将每个点视为一个二元组(x,p),表示从起点到x有p条路径免费,相当于构建了一张分层图,N*k个节点,P*k条边.在这张图上用优先队列优化的SPFA算法求解,注意这里的d数组 ...
- 洛谷 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 ...
- USACO Telephone Lines
洛谷 P1948 [USACO08JAN]电话线Telephone Lines https://www.luogu.org/problem/P1948 JDOJ 2556: USACO 2008 Ja ...
- BZOJ1614: [Usaco2007 Jan]Telephone Lines架设电话线
1614: [Usaco2007 Jan]Telephone Lines架设电话线 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 892 Solved: ...
随机推荐
- python下正则表达式的随笔记录
使用了下正则的表达式: 目的:取出字符串中{}中的内容 最后使用的正则表达式为 {(.*?)} 先看 .*? : 首先 . 是用来匹配字符串,但是只能匹配一次. 所以加上 * ,可以让 ...
- Harmony OS 开发避坑指南——DevEco Device Tool 安装配置
Harmony OS 开发指南--DevEco Device Tool 安装配置 本文介绍如何在Windows主机上安装DevEco Device Tool工具. 坑点总结: 国内部分网络环境下,安装 ...
- What number should I guess next ?——由《鹰蛋》一题引发的思考
What number should I guess next ? 这篇文章的灵感来源于最近技术部的团建与著名的DP优化<鹰蛋>.记得在一个月前,查到鹰蛋的题解前,我在与同学讨论时,一直试 ...
- Java知识系统回顾整理01基础02面向对象02属性
一.根据实例给出"属性"的定义 一个英雄有姓名,血量,护甲等等状态 这些状态就叫做一个类的属性 二.属性的类型 属性的类型可以是基本类型,比如int整数,float 浮点数 也可以 ...
- Arduino 与 SPI 结合使用 以及SPI 深层理解
本文主要讲解两部分内容,不做任何转发,仅个人学习记录: 一. Arduino 与 SPI 结合使用 : 二. SPI 深层理解 有价值的几个好的参考: 1. 中文版: https://blog.cs ...
- Jmeter之『JSR223脚本』
Json处理(通过JS) 对于Json字符串,需要使用单引号『''』(因为Json中已存在双引号) // String转为Object var jsonObj = JSON.parse('${data ...
- Linux就该这么学28期——开篇
2020.10.03 正式开始系统学习Linux之旅,希望能在老刘的带领下,掌握操作要领. 现将所学记录在此. 学习环境如下: VmwareWorkStation 15 --虚拟机软件 versio ...
- Python中字符串有哪些常用操作?纯干货超详细
- spring redis 配置
- java 的 callback
Java 本身没有回调这一说,但是面向对象可以模拟出来. 1. 回调接口对象 ICommand package com.git.Cmder; public interface ICommand { v ...