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: ...
随机推荐
- c语言的变量,常量及作用域等
1.const定义常量 在C语言中,const可以用来定义的一个常量,在变量名前加上const即可. int const a: 定义了一个a的整数常量,且a的值不能被修改.如果要修改a的值,有以下两种 ...
- mysql-6-groupby
#进阶5:分组查询 /* SELECT FROM WHERE GROUP BY ORDER BY 查询列表要求是分组函数和 group by 之后出现的字段 1.筛选条件分为两类: 数据源 位置 关键 ...
- python基础知识 变量 数据类型 if判断
cpu 内存 硬盘 操作系统 cpu:计算机的运算和计算中心,相当于人类的大脑 飞机 内存:暂时存储一些数据,临时加载数据和应用程序 4G 8G 16G 32G 速度快,高铁 断电即消失 造价高 硬盘 ...
- C++指针delete后还要置为null
非常好的一篇说明: 转载:https://blog.csdn.net/qq_36570733/article/details/80043321 众所周知,最开始我们用new来创建一个指针,那么等我们用 ...
- VS2015如何调试自己写的DLL与调试
转载: 1. https://blog.csdn.net/u014738665/article/details/79779632 2. https://blog.csdn.net/jacke121/a ...
- 一、Vuforia_AR
一.AR概念: 增强现实(Augmented Reality,简称AR),是一种将虚拟信息与真实世界巧妙融合的技术,广泛运用了多媒体.三维建模.实时跟踪及注册.智能交互.传感等多种技术手段,将计算机生 ...
- vue 组件的封装
封装的原因 首先封装组件的需求肯定是多个地方要用到同一个东西,他们都有公共的地方,vue的封装 简单来说就是将公共参数封装起来 然后在需要的地方引入 //子组件封装 <template> ...
- C++调用全局函数与类成员函数
void testfunc(void *param) { printf("\n\tcall global function %s\n", param); } void *GetCl ...
- 多测师讲解pthon _函数__return_高级讲师肖sir
#函数中的返回的作用(return) 案例: #函数中的返回的作用:def fun(): #定义的一个函数 num =100 a=num/2 #print(a) #50.0 return a # pr ...
- 阿里百秀后台管理项目笔记 ---- Day01
摘要 在此记录一下阿里百秀项目的教学视频的学习笔记,部分页面被我修改了,某些页面效果会不一样,基本操作是一致的,好记性不如烂笔头,加油叭!!! step 1 : 整合全部静态页面 将静态页面全部拷贝到 ...