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


    Description

    FarmerJohn打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务。于是,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最少需要在电话线上花多少钱。

    Input

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

    Output

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

    Sample Input

    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连结一对电话线杆。

    Sample Output

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

    Solution

    二分判断是否可行
    对于这个图,若两点之间的路径长大于mid,那么这个边就必须需要一个名额k
    设超过mid的边权为1,没超过的边为0
    跑一遍SPFA,若最短路大于k则无法实现

    Code

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<queue>
     5 #define N (1001)
     6 using namespace std;
     7 
     8 int n,p,k,u,v,ll;
     9 int dis[N],len[N][N],line[N*10][4];
    10 bool used[N];
    11 queue<int>q;
    12 
    13 bool check (int m)
    14 {
    15     memset(len,-1,sizeof(len));
    16     memset(used,false,sizeof(used));
    17     memset(dis,0x3f,sizeof(dis));
    18     for (int i=1;i<=p;++i)
    19         if (line[i][3]>m)
    20         {
    21             len[line[i][1]][line[i][2]]=1;
    22             len[line[i][2]][line[i][1]]=1;
    23         }
    24         else
    25         {
    26             len[line[i][1]][line[i][2]]=0;
    27             len[line[i][2]][line[i][1]]=0;
    28         }
    29             
    30     used[1]=true; dis[1]=0; q.push(1);
    31     while (!q.empty())
    32     {
    33         int x=q.front();
    34         q.pop();
    35         for (int i=1;i<=n;++i)
    36         {
    37             if (len[x][i]!=-1&&dis[x]+len[x][i]<dis[i])
    38             {
    39                 dis[i]=dis[x]+len[x][i];
    40                 if (!used[i])
    41                 {
    42                     used[i]=true;
    43                     q.push(i);
    44                 }
    45             }    
    46         }
    47         used[x]=false;
    48     }    
    49     if (dis[n]>k) return false;
    50     else return true;
    51 }
    52 
    53 int main()
    54 {
    55     scanf("%d%d%d",&n,&p,&k);
    56     for (int i=1;i<=p;++i)
    57     {
    58         scanf("%d%d%d",&u,&v,&ll);
    59         line[i][1]=u; line[i][2]=v; line[i][3]=ll;
    60     }
    61     int l=0,r=1000000000;
    62     while (l<r)
    63     {
    64         int mid=(l+r)/2;
    65         if (check(mid)) r=mid;
    66         else l=mid+1;
    67     }
    68     if (r!=1000000000) cout<<l;
    69     else cout<<-1;
    70 }
  • 相关阅读:
    CodeForces 404C Restore Graph (构造)
    UVa 1204 Fun Game (状压DP)
    HDU 5038 Grade (水题,坑题)
    mybatis整合Spring编码
    关于Spring MVC写的不错的几篇博客
    SpringMVC配置文件详解:<context:annotation-config/>和<context:component-scan base-package=""/>和<mvc:annotation-driven />
    常见文件下载后缀
    Spring MVC
    Spring
    反射
  • 原文地址:https://www.cnblogs.com/refun/p/9598324.html
Copyright © 2020-2023  润新知