传送门

这题直接做显然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. PHP 程序员学数据结构与算法之《栈》

    “要成高手,必练此功”.   要成为优秀的程序员,数据结构和算法是必修的内容.而现在的Web程序员使用传统算法和数据结构都比较少,因为很多算法都是包装好的,不用我们去操心具体的实现细节,如PHP的取栈 ...

  2. 关联github, 添加gitignore 规则

    1. 新建Maven项目 2. 新建github repository 3. 执行命令 echo "# se" >> README.md git init git ad ...

  3. 第二次安装docker时,报Transaction check error的解决方法

    如果在yum安装软件的时候,出现了Transaction check error:这种情况,说明rpm软件包出现了冲突,解决方法是: vi /etc/yum.repos.d/epel.repo 将en ...

  4. HQL中的Like查询需要注意的地方

    public List getOrgan(String organCode, String organName) {    String hsql;    List list; if (organCo ...

  5. 第三方苹果开发库之ASIHTTPRequest

    转载于:http://www.dreamingwish.com/dream-2011/apples-third-party-development-libraries-asihttprequest.h ...

  6. 给vim编辑器自动添加行号

    1.只改变当前用户的vim 在~目录下  vim .vimrc添加一行 set number 即可(普通用户权限即可) 2. 改变所有用户的vim 打开文件 /etc/vimrc 添加一行 set n ...

  7. UnicodeEncodeError: ‘ascii’ codec can’t encode

    [UnicodeEncodeError: ‘ascii’ codec can’t encode] Python默认环境编码通过下面的方法可以获取: 基本上是ascii编码方式,由此Python自然调用 ...

  8. java基础五 [数字与静态](阅读Head First Java记录)

    本章主要讲了静态变量.静态方法,final关键词.以及介绍了怎么对数字和日期进行格式化输出.这里对这些内容进行了整理.本章还介绍了java.util.Date和java.util.Calendar来操 ...

  9. 网站发布时候,图片,css,js等都不显示

    因为IIS里面的MIME类型没有添加,就是安装IIS时候没有勾选对.需要重新勾选,安装IIS.

  10. long类型与int类型的转换

    在数据库中会出现,numberic转换为int出错 在网站中,提交form的时候出现long转int失败会报错,跌了两次坑,还有ajax提交的时候long转int会报错.