传送门

这题直接做显然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. TDictionary 是delphi用的,c++builder用起来太吃力。

    TDictionary 是delphi用的,c++builder用起来太吃力.c++还是用std::map代替.c++d map很好用啊.https://blog.csdn.net/ddkxddkx/ ...

  2. 在mfc中picture控件中显示Mat图片<转>

    void ShowMatImgToWnd(CWnd* pWnd, cv::Mat img) { if(img.empty()) return; CRect drect; pWnd->GetCli ...

  3. How to Pronounce the Word ‘TO’

    How to Pronounce the Word ‘TO’ Share Tweet Share Tagged With: TO Reduction Study the TO reduction.   ...

  4. Spring Boot中启动HTTPS

    一,生成https 的证书 1,在相应的根目录下 keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize -keyst ...

  5. springmvc获取资源文件的两种方式(超简单)

    1 比如我们在sc目录下新建一个db.properties文件内容如下 DriverClass=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306 ...

  6. 神经网络中embedding层作用——本质就是word2vec,数据降维,同时可以很方便计算同义词(各个word之间的距离),底层实现是2-gram(词频)+神经网络

    Embedding tflearn.layers.embedding_ops.embedding (incoming, input_dim, output_dim, validate_indices= ...

  7. JAVA数据类型(转载)

    JAVA中值类型的只有short,char,byte,int,long,double,float,boolean八大基本类型,其他的所有类型都是引用类型. 首先我们都知道在编程中赋值运算“=”的意思是 ...

  8. SpringCloud组件和概念介绍1

    一:什么是微服务(Microservice) 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务.这些小的Web服务可以独立地编译及 ...

  9. oracle查询锁表

    select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = ...

  10. 关于oracle数据库

    Oracle数据库是做什么的? oracle数据库和其他数据库一样,都是保存数据的,同时可以去查询,修改,删除等oracle和其他数据不一样的地方在于,它又复杂的机制可以保证在数据库服务器突然坏了的情 ...