一個通常的網絡系統能夠被描述成一張無向連通圖。圖上的每一個節點爲一個服務器,鏈接服務器與服務器的數據線則看做圖上的一條邊,邊權爲該數據線的長度。兩個服務器之間的通信距離被定義爲其對應節點之間最短路的長度。ios
如今,考慮一個當前圖結構爲樹的網絡系統。你做爲該網絡系統的管理員,被要求在這個系統中新加入一條給定長度的數據線。數據線能夠連在任意兩個服務器上。服務器
你的任務是,求出在全部合法的方案中,通信距離最遠的兩個服務器之間的最小距離。網絡
輸入包含多組數據。對於每組數據,輸入的第一行包含二個正整數 NN,L, 其中 NN表示服務器個數,LL 爲新加入數據線的長度。ide
接下來 n−1n−1 行,第 ii 行有三個正整數 ai,bi,liai,bi,li,表示有一條長度爲 lili 的數據線鏈接服務器 ai,biai,bi。服務器的編號爲 1∼N1∼N。測試
輸入的末尾以兩個 00 做爲結束。atom
對於每組數據,輸出一行一個整數,描述在全部合法的方案中,通信距離最遠的兩個服務器之間的最小距離。spa
7 1 1 2 1 2 3 1 3 4 1 4 5 1 5 6 1 6 7 1 0 0
3
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
143 232
見樣例數據下載。code
一共有 20 個測試點。編號爲 1∼201∼20。每一個測試點爲 5 分。xml
保證在任一測試點中,數據的組數不會超過 1515,且全部數據的 NN 之和不超過數據範圍中標明的 NN 的最大值的 55 倍。blog
保證全部的輸入數據均爲不超過 231−1231−1 的非負整數,保證 NN≥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; }