uoj #298. 【CTSC2017】網絡

#298. 【CTSC2017】網絡

一個通常的網絡系統能夠被描述成一張無向連通圖。圖上的每一個節點爲一個服務器,鏈接服務器與服務器的數據線則看做圖上的一條邊,邊權爲該數據線的長度。兩個服務器之間的通信距離被定義爲其對應節點之間最短路的長度。ios

如今,考慮一個當前圖結構爲樹的網絡系統。你做爲該網絡系統的管理員,被要求在這個系統中新加入一條給定長度的數據線。數據線能夠連在任意兩個服務器上。服務器

你的任務是,求出在全部合法的方案中,通信距離最遠的兩個服務器之間的最小距離。網絡

輸入格式

輸入包含多組數據。對於每組數據,輸入的第一行包含二個正整數 N,LN,L, 其中 NN表示服務器個數,LL 爲新加入數據線的長度。ide

接下來 n1n−1 行,第 ii 行有三個正整數 ai,bi,liai,bi,li,表示有一條長度爲 lili 的數據線鏈接服務器 ai,biai,bi。服務器的編號爲 1N1∼N。測試

輸入的末尾以兩個 00 做爲結束。atom

輸出格式

對於每組數據,輸出一行一個整數,描述在全部合法的方案中,通信距離最遠的兩個服務器之間的最小距離。spa

樣例一

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

樣例三

見樣例數據下載。code

限制與約定

一共有 20 個測試點。編號爲 1201∼20。每一個測試點爲 5 分。xml

保證在任一測試點中,數據的組數不會超過 1515,且全部數據的 NN 之和不超過數據範圍中標明的 NN 的最大值的 55 倍。blog

保證全部的輸入數據均爲不超過 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分 暴力
相關文章
相關標籤/搜索