传送门

这题直接做显然gg" role="presentation" style="position: relative;">gggg,看这数据范围也不可能是只跑一波最短路那么简单。

没错,这道题需要你跑很多次最短路。

没错,这是一道二分+最短路验证的题。

事实上,题目要求的东西已经提示了要使用二分。毕竟是求路径上第k+1" role="presentation" style="position: relative;">k+1k+1大条边的权值的最小值。所以这东西怎么二分判定?

干脆二分答案吧,二分路径上第k+1" role="presentation" style="position: relative;">k+1k+1大条边的权值的最小值是k" role="presentation" style="position: relative;">kk,然后怎么判定?

等等,这样的话不比k" role="presentation" style="position: relative;">kk大的边都没用了啊,也就是说,只有比k" role="presentation" style="position: relative;">kk大的边会影响答案,这样的话如果通过不超过题目数量限制的剩下的大边无法到达终点的话,显然k" role="presentation" style="position: relative;">kk取小了,不然的话可以继续将k" role="presentation" style="position: relative;">kk缩小。

因此算法流程就很明显了,对于二分出来的值v" role="presentation" style="position: relative;">vv,所有边中权值比v" role="presentation" style="position: relative;">vv大的真实边权为1,其它的边真实边权为0,然后在新图上跑最短路,跑出来如果最短路长度没有超出题目限制,就让v" role="presentation" style="position: relative;">vv减小,否则让v" role="presentation" style="position: relative;">vv增大。

代码如下:

#include<bits/stdc++.h>
#define N 1005
#define M 1000005
using namespace std;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
int cnt=0,n,p,k,first[N],d[N];
bool vis[N];
struct node{int u,v,w;}t[M];
struct Node{int v,next,w;}e[M];
struct heap{int u,d;};
inline bool operator<(heap a,heap b){return a.d>b.d;}
inline void add(int u,int v,int w){
    e[++cnt].v=v,e[cnt].w=w;
    e[cnt].next=first[u];
    first[u]=cnt;
}
inline bool dijkstra(){
    memset(vis,false,sizeof(vis));
    memset(d,0x3f3f3f3f,sizeof(d));
    priority_queue<heap>q;
    q.push((heap){1,0});
    d[1]=0;
    while(!q.empty()){
        heap x=q.top();
        q.pop();
        if(vis[x.u])continue;
        vis[x.u]=true;
        for(int i=first[x.u];i;i=e[i].next){
            int v=e[i].v;
            if(vis[v])continue;
            if(d[v]>d[x.u]+e[i].w){
                d[v]=d[x.u]+e[i].w;
                q.push((heap){v,d[v]});
            }
        }
    }
    return d[n]<=k;
}
inline bool check(int x){
    memset(e,0,sizeof(e)),cnt=0,memset(first,0,sizeof(first));
    for(int i=1;i<=p;++i){
        if(t[i].w<=x)add(t[i].u,t[i].v,0),add(t[i].v,t[i].u,0);
        else add(t[i].u,t[i].v,1),add(t[i].v,t[i].u,1);
    }
    return dijkstra();
}
int main(){
    int l=0,r=0;
    n=read(),p=read(),k=read();
    for(int i=1;i<=p;++i)t[i].u=read(),t[i].v=read(),r=max(r,t[i].w=read());
    if(!check(0x3f3f3f3f)){
        printf("-1");
        return 0;
    }
    while(l<=r){
        int mid=l+r>>1;
        if(check(mid))r=mid-1;
        else l=mid+1;
    }
    if(check(l))printf("%d",l);
    else printf("%d",r);
    return 0;
}

2018.07.20 bzoj1614: Telephone Lines架设电话线(二分+最短路)的更多相关文章

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

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

  2. BZOJ 1614 [Usaco2007 Jan]Telephone Lines架设电话线 (二分+最短路)

    题意: 给一个2e4带正边权的图,可以免费k个边,一条路径的花费为路径上边权最大值,问你1到n的最小花费 思路: 对于一个x,我们如果将大于等于x的边权全部免费,那么至少需要免费的边的数量就是 “设大 ...

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

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

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

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

  5. [Usaco2007 Jan]Telephone Lines架设电话线[二分答案+最短路思想]

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

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

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

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

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

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

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

  9. [bzoj1614][Usaco2007Jan]Telephone Lines 架设电话线_二分答案_最短路

    Telephone Lines bzoj-1614 Usaco-2007Jan 题目大意:给你一个n个点m条边的带边权无向图,求最短路.可以选取k条边免费. 注释:$1\le n\le 10^3$,$ ...

随机推荐

  1. VBox 安装 macOS 10.12

    安装步骤⑴ 下载及解压 macOS 10.12 Sierra Final by TechReviews.rar ⑵ 下载及双击安装 VirtualBox-5.1.6-110634-Win.exe ,默 ...

  2. mongodb基础学习3-查询的复杂用法

    昨天看了一下查询,今天来说下查询的复杂用法,可以类比mysql的查询 $ne:不等于 $gt, $gte, $lt, $lte:大于,大于等于,小于,小于等于 $in $and $nor:相当于上面的 ...

  3. log4j显示hibernate sql参数的配置

    #下面的两条配置非常重要,设置为trace后,将可以看到打印出sql中 ? 占位符的实际内容 #this is the most important config for showing parame ...

  4. Access-Control-Allow-Origin与跨域

    文章转载地址: http://freewind.me/blog/20140327/2456.html 问题 在某域名下使用Ajax向另一个域名下的页面请求数据,会遇到跨域问题.另一个域名必须在resp ...

  5. L2tp协议简单解析

    1.L2TP简介 L2TP(Layer 2 Tunneling Protocol,二层隧道协议)是VPDN(Virtual PrivateDial-up Network,虚拟私有拨号网)隧道协议的一种 ...

  6. Unity C# 调用 C++ DLL 并在 DLL 中调用 C# 的回调函数

    Unity C# 调用 C++ DLL 并在 DLL 中调用 C# 的回调函数~~~    呵呵... 看着有点晕.. 再解释一下就是 在Unity中 使用 C# 调用 C++ 写的 DLL, 但是在 ...

  7. 尴尬!Jsp内置对象

    今天挺尴尬的,上网络安全课做错了ppt ,尴尬到头皮发麻. JSP内置对象 JSP内置对象是Web容器创建的一组对象,不使用new关就可以使用的内置对象. <%int[ ]value= {60, ...

  8. pandas 一行文本拆多行,一列拆多列

    https://zhuanlan.zhihu.com/p/28337202 一列拆多列: http://blog.csdn.net/qq_22238533/article/details/761875 ...

  9. zg项目 应用系统编码原则

    一.编码说明: 1.系统编码采用三码为原则,通常两码简称之. 1>.子系统或类型 2>.系统小分类 3>.系统大分类 如 IPMS领域业务群: DA 应用软件发展管理系统 DE公用副 ...

  10. 编辑距离12 · Edit Distance12

    [抄题]: 给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数. 你总共三种操作方法: 插入一个字符 删除一个字符 替换一个字符 [思维问题]: [一句话思路]: ...