• POJ 2607 Fire Station(Floyd打表+枚举更新最优)


    题目链接:

    http://poj.org/problem?id=2607

    Description

    A city is served by a number of fire stations. Some residents have complained that the distance from their houses to the nearest station is too far, so a new station is to be built. You are to choose the location of the fire station so as to reduce the distance to the nearest station from the houses of the disgruntled residents.
    The city has up to 500 intersections, connected by road segments of various lengths. No more than 20 road segments intersect at a given intersection. The location of houses and firestations alike are considered to be at intersections (the travel distance from the intersection to the actual building can be discounted). Furthermore, we assume that there is at least one house associated with every intersection. There may be more than one firestation per intersection.

    Input

    The first line of input contains two positive integers: f,the number of existing fire stations (f <= 100) and i, the number of intersections (i <= 500). The intersections are numbered from 1 to i consecutively. f lines follow; each contains the intersection number at which an existing fire station is found. A number of lines follow, each containing three positive integers: the number of an intersection, the number of a different intersection, and the length of the road segment connecting the intersections. All road segments are two-way (at least as far as fire engines are concerned), and there will exist a route between any pair of intersections.

    Output

    You are to output a single integer: the lowest intersection number at which a new fire station should be built so as to minimize the maximum distance from any intersection to the nearest fire station.

    Sample Input

    1 6
    2
    1 2 10
    2 3 10
    3 4 10
    4 5 10
    5 6 10
    6 1 10
    

    Sample Output

    5
    

    Source

     1 /*
     2 问题
     3 给出已经是消防站的个数和每个消防站在哪个顶点上,给出以EOF结尾的边
     4 计算并输出新建一个消防站,使得各个站点距离自己最近的消防站的距离最小,比如样例中选择新建在5号,使得各个顶点距离自己最近的
     5 消防站的距离最远是10,而选择在其他点时有的站点距离自己最近的消防站比10大,所以选择5号顶点,另外就是可以选择已经有消防站的
     6 点新建,因为题目要有新建的顶点的标号尽量小。
     7 
     8 解题思路
     9 500个站点使用Floyd算出各个顶点到各个顶点的最短距离,方便之后枚举新站点时直接查表得到两点的最短距离,然后依次枚举,找出各个
    10 站点距离自己最近的消防站的最大距离,更新最优,最后输出标号即可。 
    11 */ 
    12 #include<cstdio>
    13 #include<cstring>
    14 #include<algorithm>
    15 
    16 using namespace std;
    17 const int maxn=600;
    18 const int INF=99999999;
    19 int e[maxn][maxn],book[maxn],ans[maxn],m;
    20 
    21 void Floyd();
    22 
    23 int main()
    24 {
    25     int f,t1,i,j,t2,t3,t4;
    26     while(scanf("%d%d",&f,&m) != EOF){
    27         memset(book,0,sizeof(book));
    28         for(i=1;i<=m;i++)
    29             ans[i]=INF;
    30             
    31         for(i=0;i<f;i++){
    32             scanf("%d",&t1);
    33             book[t1]=1;//标记是消防站 
    34         }
    35         
    36         for(i=1;i<=m;i++){
    37             for(j=1;j<=m;j++){
    38                 e[i][j] = i==j?0:INF;
    39             }
    40         }
    41 
    42         while(scanf("%d%d%d",&t2,&t3,&t4) != EOF){
    43             e[t2][t3]=e[t3][t2]=min(t4,e[t2][t3]);
    44         }
    45         Floyd();
    46         
    47         //ans数组表示各个站点距离离自己最近的消防站的距离
    48         for(i=1;i<=m;i++){
    49             if(book[i])
    50                 ans[i]=0;
    51             else
    52                 for(j=1;j<=m;j++){
    53                     if(book[j])
    54                         ans[i]=min(ans[i],e[i][j]);
    55                 }
    56         }
    57         /*for(i=1;i<=m;i++){
    58             printf("%d ",ans[i]);
    59         }
    60         printf("
    ");*/
    61         
    62         int ansmin=INF;
    63         int biaohao;
    64         for(i=1;i<=m;i++){//枚举每个站点是消防站,找到该点是新建消防站时距离该点最远的点并记录距离,如果该距离是最小的 
    65         //记录该点最后输出 
    66             int temp=-1;
    67             for(j=1;j<=m;j++)
    68                 temp = max(min(e[i][j],ans[j]),temp);
    69                 
    70             if(ansmin > temp){
    71                 ansmin = temp;
    72                 biaohao=i;
    73             }
    74         }
    75         
    76         printf("%d
    ",biaohao);
    77     }
    78     return 0;
    79 }
    80 
    81 void Floyd()
    82 {
    83     int i,j,k;
    84     for(k=1;k<=m;k++)
    85         for(i=1;i<=m;i++)
    86             for(j=1;j<=m;j++)
    87                 if(e[i][j] > e[i][k]+e[k][j])
    88                     e[i][j] = e[i][k]+e[k][j];
    89 }
  • 相关阅读:
    [BZOJ3745][Coci2015]Norma
    [OJ#15]TR #2 画心
    [BZOJ3585][BZOJ3339]mex
    [OJ#63]树句节够提
    [LOJ#2255][BZOJ5017][Snoi2017]炸弹
    [LOJ#525]「LibreOJ β Round #4」多项式
    【字符编码】Java字符编码详细解答及问题探讨
    【Java基础】序列化与反序列化深入分析
    【目录】JVM目录
    【知识积累】随机数生成的几种方法
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/9080987.html
Copyright © 2020-2023  润新知