二分+dij题目

首先读一遍题目,一定要仔细读(不要问我为什么,我就是受害者qwq

你会发现最终的费用是由最长的电话线决定的,而非电话线长度和。

至此就有了一个基本思路——枚举(二分)出可能的最长电话线长度,然后对其进行dij判断。

dij思路如下:

1.已知枚举出了假定答案ans;

2.在最短路过程中,判断有多少条线长度大于ans,并将其免费;

3.最后判断免费条数,若大于给出的t即不可行,反之可行。

开long long!!!

代码:

#include<bits/stdc++.h>
using namespace std;
long long ca,k,ma,ans,cnt,n,m,vis[2050],a,b,dis[2050],nex[20500],fst[2050],v[20500],w[20500],f[2050],sum[2050],ww;
int dj(long long ans)
{
memset(dis,0x7f/3,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[1]=0;
long long minn,t=0;
for(register long long i=1;i<=n;i++)
{
minn=1e12;
for(long long j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]<minn)
{
minn=dis[j];
t=j;
}
}
vis[t]=1;
for(register long long j=fst[t];j;j=nex[j])
{
if(w[j]>ans)
dis[v[j]]=min(dis[v[j]],dis[t]+1);
else
dis[v[j]]=min(dis[v[j]],dis[t]);
}
}
if(dis[n]>1e8)
{
cout<<-1;
return 2;
}
if(dis[n]>k)
return 0;
return 1;
}
void binary(long long l,long long r)
{
if(l>r)
{
cout<<ans;
return ;
}
long long mid=(l+r)>>1;
int dij=dj(mid);
if(dij==2)
return;
if(dij==1)
{
ans=mid;
binary(l,mid-1);
}
else
binary(mid+1,r);
return ;
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&k);
for(long long i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&a,&b,&ww);
ma+=ww;
nex[++cnt]=fst[a];
fst[a]=cnt;
v[cnt]=b;
w[cnt]=ww;
nex[++cnt]=fst[b];
fst[b]=cnt;
v[cnt]=a;
w[cnt]=ww;
}
binary(0,ma);
return 0;
}

题解 guP1948 【[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

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

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

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

  7. [USACO08JAN]电话线Telephone Lines

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

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

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

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

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

随机推荐

  1. 处理SpringMVC中遇到的乱码问题

    乱码在日常开发写代码中是非常常见的,以前乱码使用的是通过设置一个过滤器解决, 现在可以使用SpringMVC给提供的过滤器,在web.xml设置,这比我们自己写的过滤器强大的的多. 注意:每次修改了x ...

  2. 使用goland调试远程代码

    前言 很多时候我们都在window上使用goland,并直接使用goland调试go代码. 但是很多时候我们的程序运行在Linux服务器上,虽然可以通过dlv命令行进行手动打断点调试,但是太麻烦了. ...

  3. node.js学习(1)全局对象

    1 计时器 1)三秒后执行 2) 每隔2秒执行一次 3)清除计时器 2 全局对象 1)当前文件所在目录 2)当前文件路径

  4. Python+Selenium学习笔记2 - 字符串

    跟着网络课程学了几个小程序. 1.判断a字符串是否为b字符串的子串 1 # coding = utf-8 2 3 # 判断str_a字符串是否为str_b字符串的子串 4 5 str_a = &quo ...

  5. 转载 | Scala 如何避免使用 Null

    在 Java 里,null 是一个关键字,不是一个对象,所以对它调用任何方法都是非法的. Scala 的 Option类型 Scala在变量和函数返回值可能不会引用任何值的时候使用 Option 类型 ...

  6. TensorFlow多元线性回归实现

    多元线性回归的具体实现 导入需要的所有软件包:   因为各特征的数据范围不同,需要归一化特征数据.为此定义一个归一化函数.另外,这里添加一个额外的固定输入值将权重和偏置结合起来.为此定义函数 appe ...

  7. HLS后端示例

    HLS后端示例 TVM支持带有SDAccel的Xilinx FPGA板.这是有关如何将TVM部署到AWS F1 FPGA实例的文档. 此功能仍处于试验阶段.暂时无法使用SDAccel部署端到端神经网络 ...

  8. Nucleus SE RTOS初始化和启动

    Nucleus SE RTOS初始化和启动 Nucleus SE RTOS initialization and start-up 对于任何类型的操作系统,都有某种类型的启动机制.具体的工作方式因系统 ...

  9. Django(59)验证和授权

    验证和授权概述   Django有一个内置的授权系统.他用来处理用户.分组.权限以及基于cookie的会话系统.Django的授权系统包括验证和授权两个部分.验证是验证这个用户是否是他声称的人(比如用 ...

  10. 使用ElementTree解析,操作xml

    一.最近在实际工作中需要对一部分接口进行测试,接口的入参与出参都是xml格式的数据,所以用到了python内部模块ElementTree对xml进行解析,并根据实际需求操作xml数据 二.代码示例 # ...