传送门

这题直接做显然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. J2SE 8的Lambda --- Comparator

    Person[] personArray = new Person[]{new Person("Tom"),new Person("Jack"),new Per ...

  2. Find 和 Findstr

    FIND 在文件中搜索文字字符串. FINDSTR 在文件中搜索字符串.   findstr能用正则表达式,而find不能   dir c:|find /N /I /C "windows&q ...

  3. 前端开发-2-HTML-head标签

    browser英 /'braʊzə/ 美 /'braʊzɚ/ 浏览器 explorer英 /ek'splɔːrə(r)/ 美 /ɪk'splɔrɚ/ 探险者,资源管理器 1.index 2.head标 ...

  4. 11 并发编程-(线程)-信号量&Event&定时器

    1.信号量(本质也是一把锁)Semaphore模块 信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行, 信号量同一时间可以有5个任务拿到锁去执行, 如果说互斥锁是合租 ...

  5. uiview animation 卡一下

    原因:有个下载图片的地方在主线程执行,导致动画卡一下.

  6. python, Django csrf token的问题

    环境 Window 7 Python2.7 Django1.4.1 sqlite3 问题 在使用Django搭建好测试环境后,写了一个提交POST表单提交留言的测试页面. 如图: 填写表单,点击“提交 ...

  7. js实现jquery函数animate动画效果

    <script> function animate(obj, json, interval, sp, fn) { clearInterval(obj.timer); function ge ...

  8. vim使用方法:

    vim使用方法: 模式: 编辑模式.未编辑模式.命令行模式 i 插入形式进入编辑模式 a 增加 o 下行编辑 O 上行插入 : 进入命令行模式 esc 退出编辑模式 wq 保存文件 yy 复制 p 粘 ...

  9. SO\PR回写的数据如下

    insert into OUT_ORDER_RES ---JAVA FOR PR ) as LGORT ,'SAPRFC' as ERNAM,out_pr.due_datetime,out_pr.so ...

  10. 使用ecstore-sdk开发包制作易开店和启明星模板

    前言: 尽管商派官网有模板开发教程,但是诸多方面太过笼统.我等平庸之辈,纵使细心研读,潜心修炼,亦未能品味练功境界,领悟其中真谛. 商派有云,此九阳真经不用您挥刀****本人却感觉此教程令人抓狂,无人 ...