• JZOJ 4.22 2132——【2017.4.21普及】架设电话线


    题目描述

    Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务。于是,FJ必须为此向电信公司支付一定的费用。
    FJ的农场周围分布着N(1 <= N <= 1,000)根按1..N顺次编号的废弃的电话线
    杆,任意两根电话线杆间都没有电话线相连。一共P(1 <= P <= 10,000)对电话
    线杆间可以拉电话线,其余的那些由于隔得太远而无法被连接。第i对电话线杆的两个端点分别为A_i、B_i,它们间的距离为L_i (1 <= L_i <= 1,000,000)。数据中保证每对{A_i,B_i}最多只出现1次。编号为1的电话线杆已经接入了全国的电话网络,整个农场的电话线全都连到了编号为N的电话线杆上。也就是说,FJ的任务仅仅是找一条将1号和N号电话线杆连起来的路径,其余的电话线杆并不一定要连入电话网络。
    经过谈判,电信公司最终同意免费为FJ连结K(0 <= K < N)对由FJ指定的电话线杆。对于此外的那些电话线,FJ需要为它们付的费用,等于其中最长的电话线的长度(每根电话线仅连结一对电话线杆)。如果需要连结的电话线杆不超过K对,那么FJ的总支出为0。
    请你计算一下,FJ最少需要在电话线上花多少钱。

    输入

    第1行: 3个用空格隔开的整数:N,P,以及K
    第2..P+1行: 第i+1行为3个用空格隔开的整数:A_i,B_i,L_i

    输出

    第1行: 输出1个整数,为FJ在这项工程上的最小支出。如果任务不可能完成,输出-1。

    样例输入

    5 7 1
    1 2 5
    3 1 4
    2 4 8
    3 2 3
    5 2 9
    3 4 7
    4 5 6

    输入说明:
    一共有5根废弃的电话线杆。电话线杆1不能直接与电话线杆4、5相连。电话线杆5不能直接与电话线杆1、3相连。其余所有电话线杆间均可拉电话线。电信公司可以免费为FJ连结一对电话线杆。

    样例输出

    4

    输出说明:
    FJ选择如下的连结方案:1->3;3->2;2->5,这3对电话线杆间需要的电话线的长度分别为4、3、9。FJ让电信公司提供那条长度为9的电话线,于是,他所需要购买的电话线的最大长度为4。


    就是一个最短路+二分答案
    每次二分到一个答案,就搜一波最短路,判断是否超过k,如果超过,则[mid+1,r];小于则[l,mid]
    如果找不到小于等于k的路径,就输出-1


    代码如下:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define fo(i,x,y) for(int i=x;i<=y;i++)
    using namespace std;
    int ma[20010],map[20010][3],last[1010],t[20010],len,n,m,k,dis[1010],dt[10000];
    bool bz[1010];
    void add(int x,int y,int z){
        map[++len][1]=y;map[len][2]=z;
        t[len]=last[x];last[x]=len;
    }
    void spfa(){
        memset(dis,127,sizeof(dis));
        memset(bz,0,sizeof(bz));
        int st=0,en=1;
        dt[1]=1;dis[1]=0;bz[1]=true;
        while(st<en){
            st++;
            int x=dt[st];
            int c=last[x];
            while(c!=0){
                int y=map[c][1],xx=ma[c];
                if(dis[x]+xx<dis[y]){
                    dis[y]=dis[x]+xx;
                    if(!bz[y]){
                        bz[y]=true;
                        dt[++en]=y;
                    }
                }
                c=t[c];
            }bz[x]=false;
        }
    }
    int main(){
        freopen("phoneline.in","r",stdin);
        freopen("phoneline.out","w",stdout);
        scanf("%d%d%d",&n,&m,&k);
        int mx=0;
        fo(i,1,m){
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            mx=max(mx,z);
            add(x,y,z);add(y,x,z);
        }
        int l=0,r=mx,mid=(l+r)/2;
        while(l<r){
            mid=(l+r)/2;
            fo(i,1,len)if(map[i][2]<=mid)ma[i]=0;else ma[i]=1;
            spfa();
            if(dis[n]<=k)r=mid;else
            l=mid+1;
        }
        if(r==mx)printf("-1");else
        printf("%d",l);
        return 0;
    }
  • 相关阅读:
    leetcode33. Search in Rotated Sorted Array
    pycharm 设置sublime text3 monokai主题
    django class Meta
    leetcode30, Substring With Concatenation Of All Words
    Sublime text3修改tab键为缩进为四个空格,
    sublime text3 python打开图像的问题
    安装上imesupport输入法依然不跟随的解决办法,
    sublime text3 的插件冲突弃用问题,
    sublime text3 BracketHighlighter括号匹配的设置
    windows 下wget的使用
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412305.html
Copyright © 2020-2023  润新知