[NOIP2007] 提高组 洛谷P1099 树网的核
?
題目描述
設(shè)T=(V, E, W) 是一個無圈且連通的無向圖(也稱為無根樹),每條邊到有正整數(shù)的權(quán),我們稱T為樹網(wǎng)(treebetwork),其中V,E分別表示結(jié)點與邊的集合,W表示各邊長度的集合,并設(shè)T有n個結(jié)點。
路徑:樹網(wǎng)中任何兩結(jié)點a,b都存在唯一的一條簡單路徑,用d(a, b)表示以a, b為端點的路徑的長度,它是該路徑上各邊長度之和。我們稱d(a, b)為a, b兩結(jié)點間的距離。
D(v, P)=min{d(v, u), u為路徑P上的結(jié)點}。
樹網(wǎng)的直徑:樹網(wǎng)中最長的路徑成為樹網(wǎng)的直徑。對于給定的樹網(wǎng)T,直徑不一定是唯一的,但可以證明:各直徑的中點(不一定恰好是某個結(jié)點,可能在某條邊的內(nèi)部)是唯一的,我們稱該點為樹網(wǎng)的中心。
偏心距ECC(F):樹網(wǎng)T中距路徑F最遠(yuǎn)的結(jié)點到路徑F的距離,即
ECC(F)=max{d(v, F),v∈V}
任務(wù):對于給定的樹網(wǎng)T=(V, E, W)和非負(fù)整數(shù)s,求一個路徑F,他是某直徑上的一段路徑(該路徑兩端均為樹網(wǎng)中的結(jié)點),其長度不超過s(可以等于s),使偏心距ECC(F)最小。我們稱這個路徑為樹網(wǎng)T=(V, E, W)的核(Core)。必要時,F可以退化為某個結(jié)點。一般來說,在上述定義下,核不一定只有一個,但最小偏心距是唯一的。
下面的圖給出了樹網(wǎng)的一個實例。圖中,A-B與A-C是兩條直徑,長度均為20。點W是樹網(wǎng)的中心,EF邊的長度為5。如果指定s=11,則樹網(wǎng)的核為路徑DEFG(也可以取為路徑DEF),偏心距為8。如果指定s=0(或s=1、s=2),則樹網(wǎng)的核為結(jié)點F,偏心距為12。
輸入輸出格式
輸入格式:
?
輸入文件core.in包含n行:
第1行,兩個正整數(shù)n和s,中間用一個空格隔開。其中n為樹網(wǎng)結(jié)點的個數(shù),s為樹網(wǎng)的核的長度的上界。設(shè)結(jié)點編號以此為1,2,……,n。
從第2行到第n行,每行給出3個用空格隔開的正整數(shù),依次表示每一條邊的兩個端點編號和長度。例如,“2 4 7”表示連接結(jié)點2與4的邊的長度為7。
所給的數(shù)據(jù)都是爭取的,不必檢驗。
?
輸出格式:
?
輸出文件core.out只有一個非負(fù)整數(shù),為指定意義下的最小偏心距。
?
輸入輸出樣例
輸入樣例#1:【輸入樣例1】 5 2 1 2 5 2 3 2 2 4 4 2 5 3 【輸入樣例2】 8 6 1 3 2 2 3 2 3 4 6 4 5 3 4 6 4 4 7 2 7 8 3 輸出樣例#1:
【輸出樣例1】 5 【輸出樣例2】 5
說明
40%的數(shù)據(jù)滿足:5<=n<=15
70%的數(shù)據(jù)滿足:5<=n<=80
100%的數(shù)據(jù)滿足:5<=n<=300,0<=s<=1000。邊長度為不超過1000的正整數(shù)
NOIP 2007 提高第四題
?
又是卡題面的題。
原題有張說明圖來著,然而好多OJ站上都沒放圖。
先floyd跑出最短路,然后根據(jù)最短路,O(n)掃描兩次找出樹直徑。因為數(shù)據(jù)比較小,所以可以枚舉所求直徑F的兩端點(只在已找出的直徑上選點),并記錄最小答案。
1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 using namespace std; 9 const int mxn=1010; 10 int read(){ 11 int x=0,f=1;char ch=getchar(); 12 while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();} 13 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();} 14 return x*f; 15 } 16 int mp[mxn][mxn]; 17 int n,s; 18 int hd,tl;//樹直徑端點 19 void init(){ 20 21 int i,j,k; 22 for(int k=1;k<=n;k++){ 23 for(i=1;i<=n;i++) 24 for(j=1;j<=n;j++){ 25 if(i==j)continue; 26 mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]); 27 } 28 } 29 for(i=1;i<=n;i++)mp[i][i]=0; 30 int mx=0; 31 for(i=1;i<=n;i++) 32 if(mp[1][i]>mx){ 33 mx=mp[1][i]; 34 hd=i; 35 } 36 mx=0; 37 for(i=1;i<=n;i++) 38 if(mp[hd][i]>mx){ 39 mx=mp[hd][i]; 40 tl=i; 41 } 42 return; 43 } 44 int node[mxn],cnt=0; 45 int main(){ 46 memset(mp,0x3f,sizeof mp); 47 int i,j; 48 n=read();s=read(); 49 int u,v,d; 50 for(i=1;i<n;i++){ 51 u=read();v=read();d=read(); 52 mp[u][v]=mp[v][u]=d; 53 } 54 init(); 55 for(i=1;i<=n;i++) 56 if(mp[hd][i]+mp[i][tl]==mp[hd][tl]) node[++cnt]=i; 57 int ans=1e9; 58 for(i=1;i<=cnt;i++) 59 for(j=1;j<=cnt;j++){ 60 if(mp[node[i]][node[j]]>s)continue; 61 int p1=1e9,p2=1e9; 62 p1=min(mp[hd][node[i]],mp[hd][node[j]]); 63 p2=min(mp[tl][node[j]],mp[tl][node[i]]); 64 // printf("i:%d j:%d mx:%d\n",i,j,max(p1,p2)); 65 ans=min(ans,max(p1,p2)); 66 } 67 printf("%d",ans); 68 return 0; 69 }?
轉(zhuǎn)載于:https://www.cnblogs.com/SilverNebula/p/6016509.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的[NOIP2007] 提高组 洛谷P1099 树网的核的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网页3D效果库Three.js学习[二]
- 下一篇: MySQL数据库设计总结