• CSU 1307


    1307: City Tour

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 549  Solved: 124
    [Submit][Status][Web Board]

    Description

    Alice想要从城市A出发到城市B,由于Alice最近比较穷(不像集训队陈兴老师是个rich second),所以只能选择做火车从A到B。不过Alice很讨厌坐火车,火车上人比较多,比较拥挤,所以Alice有很严格的要求:火车的相邻两站间的最大距离尽可能的短,这样Alice就可以在停站的时候下车休息一下。当然Alice希望整个旅途比较短。
     

    Input

    有多组测试数据。
    每组测试数据的第一行有两个整数N,M,A,B(N<=2000, M<=50000, N >=2, A,B<=N),其中N是城市的个数,M是城市间通火车的个数。
    A,B是Alice起始的城市与目的地城市,城市的标号从1开始。
    接下来的M行每行三个整数u,v,w表示从u到v和从v到u有一条铁路,距离为w, u,v<=N, w<=10000。

    Output

    对于每组测试数据输出满足Alice要求的从A到B的最短距离。

    Sample Input

    3 3 1 2
    1 2 80
    1 3 40
    2 3 50
    3 3 1 2
    1 2 90
    1 3 10
    2 3 20
    4 5 1 4
    1 2 8
    1 4 9
    1 3 10
    2 4 7
    3 4 8
    

    Sample Output

    90
    30
    15
    

    HINT

     

    Source

    我只看出最短路

    怎么让火车的相邻两站间的最大距离尽可能的短?

    二分

     1 #include <stdio.h>
     2 #include <queue>
     3 #include <iostream>
     4 using namespace std;
     5 const int maxn = 2010;
     6 const int maxm = 50010;
     7 const int maxd = 500000000;
     8 int v[maxm],w[maxm],next[maxm],d[maxn],inq[maxn],first[maxn],e;
     9 void init()
    10 {
    11     for(int i =0;i<maxn;i++)
    12     {
    13         first[i]=-1;
    14     }
    15     e=0;
    16 }
    17 
    18 void addeage(int x,int y,int z)
    19 {
    20     v[e]=y;w[e]=z;next[e]=first[x];
    21     first[x]=e++;
    22 }
    23 
    24 int spfa(int s,int end,int mid)
    25 {
    26     queue<int> q;
    27     for(int i=0;i<maxn;i++)
    28     {
    29         d[i]=maxd;
    30     }
    31     d[s]=0;inq[s]=1;q.push(s);
    32     while(!q.empty())
    33     {
    34         int u = q.front();q.pop();inq[u]=0;
    35         for(int i = first[u];i!=-1;i=next[i])
    36         {
    37             if(d[v[i]]>d[u]+w[i]&&w[i] <= mid)
    38             {
    39                 d[v[i]]=d[u]+w[i];
    40                 if(inq[v[i]]==0)
    41                 {
    42                     q.push(v[i]);
    43                     inq[v[i]]=1;
    44                 }
    45             }
    46         }
    47     }
    48     return d[end];
    49 }
    50 int main()
    51 {
    52 
    53     int n,m,a,b;
    54     while(scanf("%d%d%d%d",&n,&m,&a,&b)!=EOF)
    55     {
    56         init();
    57         int u,v,w;
    58         int l = maxd;
    59         int r = -1;
    60         int ans = maxd;
    61         while(m--)
    62         {
    63             scanf("%d%d%d",&u,&v,&w);
    64             addeage(u,v,w);
    65             addeage(v,u,w);
    66             l = min(l,w);
    67             r = max(r,w);
    68         }
    69         while(l <= r)
    70         {
    71              int mid = (l+r)/2;
    72              int tmp = spfa(a,b,mid);
    73              if(tmp == maxd)
    74                 l = mid+1;
    75              else
    76                r = mid-1,ans = tmp;
    77         }
    78         printf("%d
    ",ans);
    79     }
    80     return 0;
    81 }
  • 相关阅读:
    获取app下载链接
    查找文件的路径
    回忆基础:制作plist文件
    Ping++中的AlipaySDK和AlicloudUTDID冲突解决方案
    CocoaPods常用操作命令
    自签名配置HTTPS
    Instruments10 分析某个类中方法的执行时间
    iOS KVC/KVO
    iOS 系统架构及常用框架
    LINQ to SQLite完美解决方案
  • 原文地址:https://www.cnblogs.com/Run-dream/p/3913536.html
Copyright © 2020-2023  润新知