zoukankan      html  css  js  c++  java
  • uoj #298. 【CTSC2017】网络

    #298. 【CTSC2017】网络

    一个一般的网络系统可以被描述成一张无向连通图。图上的每个节点为一个服务器,连接服务器与服务器的数据线则看作图上的一条边,边权为该数据线的长度。两个服务器之间的通讯距离被定义为其对应节点之间最短路的长度。

    现在,考虑一个当前图结构为树的网络系统。你作为该网络系统的管理员,被要求在这个系统中新加入一条给定长度的数据线。数据线可以连在任意两个服务器上。

    你的任务是,求出在所有合法的方案中,通讯距离最远的两个服务器之间的最小距离。

    输入格式

    输入包含多组数据。对于每组数据,输入的第一行包含二个正整数 N,LN,L, 其中 NN表示服务器个数,LL 为新加入数据线的长度。

    接下来 n1n−1 行,第 ii 行有三个正整数 ai,bi,liai,bi,li,表示有一条长度为 lili 的数据线连接服务器 ai,biai,bi。服务器的编号为 1N1∼N。

    输入的末尾以两个 00 作为结束。

    输出格式

    对于每组数据,输出一行一个整数,描述在所有合法的方案中,通讯距离最远的两个服务器之间的最小距离。

    样例一

    input

    7 1
    1 2 1
    2 3 1
    3 4 1
    4 5 1
    5 6 1
    6 7 1
    0 0
    
    

    output

    3
    
    

    样例二

    input

    6 26
    1 2 66
    2 3 11
    3 4 73
    2 5 77
    3 6 33
    10 47
    1 2 86
    2 3 69
    3 4 41
    4 5 26
    5 6 41
    2 7 73
    3 8 77
    4 9 2
    5 10 65
    0 0
    
    

    output

    143
    232
    
    

    样例三

    见样例数据下载。

    限制与约定

    一共有 20 个测试点。编号为 1201∼20。每个测试点为 5 分。

    保证在任一测试点中,数据的组数不会超过 1515,且所有数据的 NN 之和不超过数据范围中标明的 NN 的最大值的 55 倍。

    保证所有的输入数据均为不超过 2311231−1 的非负整数,保证 N1N≥1。

    保证数据合法。

    对于给定的测试点,其限制条件如下表所示。

    测试点NN测试点NN
    1 10≤10 11 20000≤20000
    2 50≤50 12
    3 100≤100 13
    4 14
    5 150≤150 15
    6 600≤600 16 100000≤100000
    7 17
    8 18
    9 2000≤2000 19
    10 20

    时间限制:1s1s

    空间限制:512MB

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 210
    using namespace std;
    int n;
    long long map[maxn][maxn],a[maxn][maxn],ans=1000000000000000;
    void init(){
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                map[i][j]=a[i][j];
    }
    void floyed(){
        for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            if(i==j||j==k||i==k)continue;
            map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
        }
    }
    long long count(){
        long long res=0;
        for(int i=1;i<=n;i++){
            for(int j=i+1;j<=n;j++)
            res=max(res,map[i][j]);
        }
        return res;
    }
    int main(){
        int l;
        while(1){
            scanf("%d%d",&n,&l);
            ans=1000000000000000;
            if(n==0&&l==0)return 0;
            int x,y,z;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    if(i!=j)a[i][j]=10000000000000;
            for(int i=1;i<n;i++){
                scanf("%d%d%d",&x,&y,&z);
                a[x][y]=a[y][x]=z;
            }
            for(int i=1;i<=n;i++)
                for(int j=i+1;j<=n;j++){
                    init();
                    map[i][j]=min(map[i][j],1LL*l);
                    map[j][i]=min(map[j][i],1LL*l);
                    floyed();
                    ans=min(ans,count());
                }
            cout<<ans<<endl;
        }
        return 0;
    }
    10分 暴力
  • 相关阅读:
    JAVA获取微信小程序openid和获取公众号openid,以及通过openid获取用户信息
    微信公众平台开发教程Java版(三) 消息接收和发送
    在JAVA中怎么比较Double类型数据的大小
    Java利用FastJson一行代码转List<Map>为List<Bean>
    关于java的Synchronized,你可能需要知道这些(上)
    Mybatis传参- 被逗号分割的字符串
    算法疑难(js实现)---8、二叉树的创建(先序遍历)
    算法疑难(js实现)---7、二叉树的创建(层次遍历)
    心得体悟帖---200522(学习方法)
    心得体悟帖---200522(什么都不想,是一种非常好的解决问题的方案)
  • 原文地址:https://www.cnblogs.com/thmyl/p/8998452.html
Copyright © 2011-2022 走看看