Telephone Lines bzoj-1614 Usaco-2007Jan

题目大意:给你一个n个点m条边的带边权无向图,求最短路。可以选取k条边免费。

注释:$1\le n\le 10^3$,$1\le m\le 10^5$

想法:一眼分层图最短路啊!

我都想出来了就上网查一下题解吧

卧槽??二分+spfa??

其实这个题不用分层图

我们二分答案,二分出最大值,然后将图中所有比mid大的边设为1,小的设为0,然后跑最短路。如果最短路的值比k大,说明最大值一定比二分的mid大。因为我的最短路值就代表着我需要将多少条边免费。

最后,附上丑陋的代码... ...

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#define N 1000+50
#define M 20000+50
using namespace std;
int head[N],dis[N];
const int inf = 0x7fffff;
int pre[N],from[N];
struct graph
{
int next,to,val;
int deval;
graph () {}
graph (int _next,int _to,int _val)
:next(_next),to(_to),val(_val){}
}edge[M];
int cnt = 0;
inline void add(int x,int y,int z)
{
edge[++cnt] = graph(head[x],y,z);
head[x]=cnt;
edge[++cnt] = graph(head[y],x,z);
head[y]=cnt;
}
int S,T;
bool in[N];
queue<int>Q;
void spfa()
{
memset(dis,0x3f,sizeof dis);
memset(in,false,sizeof in);
memset(pre,0,sizeof pre);
memset(from,0,sizeof from);
Q.push(S),dis[S]=0;in[S]=1;
while(!Q.empty())
{
int tt=Q.front();Q.pop();in[tt]=false;
for(int i=head[tt];i;i=edge[i].next)
if(dis[edge[i].to]>dis[tt]+edge[i].deval)
{
dis[edge[i].to]=dis[tt]+edge[i].deval;
pre[edge[i].to] = tt;from[edge[i].to] = i;
if(!in[edge[i].to])
{
Q.push(edge[i].to);
in[edge[i].to]=1;
}
}
}
}
int n,m,k;
bool check(int mid)
{
for(int i=1;i<=cnt;++i)
{
if(edge[i].val<=mid)edge[i].deval = 0;
else edge[i].deval = 1;
}
spfa();
if(dis[T]>k)
return false;
return true;
}
inline int read()
{
int x=0,f=1;char ch = getchar ();
while (ch < '0' || ch > '9') {if (ch == '-')f=-1;ch = getchar();}
while (ch >='0' && ch <='9') {x=(x<<1)+(x<<3)+ch -'0';ch = getchar();}
return x*f;
}
int main()
{
n=read(),m=read(),k=read();
S = 1,T = n;
int l = 0 , r = 0;
for(int i=1;i<=m;++i)
{
int x=read(),y=read(),z=read();
add(x,y,z); l = min(l,z),r = max(r,z);
}
int ans = inf;
while(l<r)
{
int mid = (l+r)>>1;
if(check(mid))
{
int now = n;
int tmp = 0;
while(now ^ 1)
{
if(edge[from[now]].deval == 0)
tmp = max(tmp,edge[from[now]].val);
now = pre[now];
}
ans = min(ans,tmp);
r = mid;
}
else
l = mid + 1;
}
printf("%d\n",ans == inf ? -1 : ans);
}

  小结:图论真神奇。

[bzoj1614][Usaco2007Jan]Telephone Lines 架设电话线_二分答案_最短路的更多相关文章

  1. 2018.07.20 bzoj1614: Telephone Lines架设电话线(二分+最短路)

    传送门 这题直接做显然gg" role="presentation" style="position: relative;">gggg,看这数据 ...

  2. bzoj 1614: [Usaco2007 Jan]Telephone Lines架设电话线【二分+spfa】

    二分答案,然后把边权大于二分值的的边赋值为1,其他边赋值为0,然后跑spfa最短路看是否满足小于等于k条边在最短路上 #include<iostream> #include<cstd ...

  3. BZOJ1614:[USACO]Telephone Lines架设电话线(二分,最短路)

    Description FarmerJohn打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司 支付一定的费用.FJ的农场周围分布着N(1<=N< ...

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

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

  5. [Usaco2007 Jan]Telephone Lines架设电话线(最短路,二分)

    [Usaco2007 Jan]Telephone Lines架设电话线 Description FarmerJohn打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向 ...

  6. BZOJ 1614: [Usaco2007 Jan]Telephone Lines架设电话线

    题目 1614: [Usaco2007 Jan]Telephone Lines架设电话线 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farm ...

  7. 【bzoj1614】[Usaco2007 Jan]Telephone Lines架设电话线 二分+SPFA

    题目描述 Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N <= 1 ...

  8. bzoj 1614 Telephone Lines架设电话线 - 二分答案 - 最短路

    Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N ...

  9. 【SPFA+二分答案】BZOJ1614- [Usaco2007 Jan]Telephone Lines架设电话线

    沉迷于刷水 以前的那个二分写法过不了QAQ 换了一种好像大家都比较常用的二分.原因还不是很清楚. [题目大意] 给出一张图,可以将其中k条边的边权减为0,求1到n的路径中最长边的最小值. [思路] 二 ...

随机推荐

  1. 使用powershell来设置时间

    https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/set-date?view=powers ...

  2. hdu 1035(DFS)

    Robot Motion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  3. PCB SQL MS 将多行有序数据转为一行数据(一列转一行)

    一.原数据:多行有序 SELECT CC.techname FROM PPEflow BB LEFT JOIN pubgyxxb CC ON BB.techno = CC.techno ORDER B ...

  4. 自学Python四 爬虫基础知识储备

    首先,推荐两个关于python爬虫不错的博客:Python爬虫入门教程专栏   和 Python爬虫学习系列教程 .写的都非常不错,我学习到了很多东西!在此,我就我看到的学到的进行总结一下! 爬虫就是 ...

  5. 5.13Junit单元测试-反射-注解

    一.Junit单元测试 * 测试分类: 1.黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值 2.白盒测试:需要些代码的.关注程序具体的执行流程 Junit使用:白盒测试 步骤: 1.定义 ...

  6. 用 Django2.0 做 简单的BBS(前端用 Bootstrap)

    实现目标: 开发首页显示BBS的标题和摘要,点击BBS的标题可跳转到BBS详细页面进行展示. 开发环境及开发工具: Python 3.6.3 Django 2.0 Pycharm 2017.3 实现过 ...

  7. 3.0 Windows和Linux双系统安装(3)

    3.0 Windows和Linux双系统安装(3) 3.1 精简的安装步骤如下:(如果已经有了前面两篇教程的安装经验,推荐看完3.1即可动手了) 双系统很多开发新人会用到,而且比起虚拟机好处是运行效率 ...

  8. 轻量数据库SQLiteDataBase的相关操作方法

    一.查询操作: 查询操作比较复杂,主要有如下操作: db.rawQuery(String sql, String[] selectionArgs); db.query(String table, St ...

  9. github添加公钥出现 github ssh key Key is invalid. Ensure you've copied the file correctly的解决办法

    因为在公钥查看的时候可能是利用了vim明明查看,所以会有换行,导致这个错误,解决方法是用cat命令查看文件,或者其他方式查看,总之公钥不能有换行.

  10. index seek和index scan 提高sql 效率

    index seek和index scan 提高sql 效率解释解释index seek和index scan:索引是一颗B树,index seek是查找从B树的根节点开始,一级一级找到目标行.ind ...