NOIP2007提高組 樹網的核

2021-08-30 15:50:06 字數 2438 閱讀 2148

noip2007提高組試題4。

設 t=(v,e,w) 是乙個無圈且連通的無向圖(也稱無根樹),每條邊帶有正整數的權,我們稱 t 為樹網(treenetwork),其中 v,e 分別表示結點與邊的集合,w 表示各邊長度的集合,並設 t 有 n 個結點。

路徑:樹網中任何兩個結點 a,b 都存在唯一的一條簡單路徑,用 d(a,b) 表示以 a,b 為端點的路徑長度,它是該路徑上各邊長度之和。我們稱 d(a,b) 為 a,b 兩個結點間的距離。

一點 v 到一條路徑 p 的距離為該點與 p 上的最近的結點的距離:

d(v,p)=min。

樹網的直徑:樹網中最長的路徑稱為樹網的直徑。對於給定的樹網 t,直徑不一定是唯一的,但是可以證明:各直徑的中點(不一定恰好是某個結點,可能在某條邊的內部)是唯一的,我們稱該點為樹網的中心。

偏心距ecc(f):樹網 t 中距路徑 f 最遠的結點到路徑 f 的距離,即:

ecc(f)=max。

任務:對於給定的樹網 t=(v,e,w)和非負整數 s,求乙個路徑 f,它是某直徑上的一段路徑(該路徑的兩端均為樹網中的結點),其長度不超過 s(可以等於s),使偏心距 ecc(f)最小,我們稱這個路徑為樹網 t=(v,e,w)的核(core)。必要時,f 可以退化為某個結點。一般來說,在上述定義下,核不一定只有乙個,但是最小偏心距是唯一的。

下面的圖給出了乙個樹網的乙個例項。圖中,a-b 與a-c 是兩條直徑,長度均為 20。點 w 是樹網的中心,ef 邊的長度為 5。如果指定 s=11,則樹網的核為路徑 defg(也可以取為路徑 def),偏心距為 8,如果指定 s=0(或s=1、s=2),則樹網的核為結點 f,偏心距為 12。

輸入包含 n 行:

第 1 行:兩個整數 n 和 s,中間用乙個空格隔開。其中 n 為樹網的核的長度的上界。設結點編號依次為1,2,…,n 。

從第 2 行到第 n 行,每行給出 3 個用空格隔開的正整數,依次表示每一條邊的兩個端點編號和長度。例如,「2 4 7 」表示連線結點 2 與 4 的邊的長度為 7。

所給的資料都是正確的,不必檢驗。

輸出只有乙個非負整數,為指定意義下的最小偏心距。

樣例資料 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

輸出

【資料範圍】

40% 的資料滿足:5<=n<=15

70% 的資料滿足:5<=n<=80

100% 的資料滿足:5<=n<=300,0<=s<=1000。邊長度為不超過 1000 的正整數。

暴力dfs。

n

nn只有300

30030

0啊!先求出直徑,然後列舉在直徑上的兩端點作為起點和終點,並把路徑上的點標記,然後從路徑上的每乙個點dfs更新答案即可,時間複雜度o(n

3)

o(n^3)

o(n3)

**:

#include

using

namespace std;

const

int max=

305;

int n,m,size,len,ans=

1e9,maxx;

int f[max]

[max]

,dis[max]

,first[max]

,vis[max]

,v[max]

,tag[max]

;struct shuedge[max<<1]

;inline

intget_int()

inline

void

build

(int x,

int y,

int z)

inline

void

init()

}inline

void

pre(

)for

(int i=

1;i<=n;i++

)for

(int j=

1;j<=n;j++)if

(i!=j&&f[i]

[j]==len)

}inline

void

dfs(

int p,

int d)

}inline

void

solve()

cout<}int

main()

樹網的核(NOIP2007提高組)

傳送門 這道題的題意首先要讀懂。簡單說,題目是想要我們選取乙個樹核,使得樹核外的其他點到樹核的距離的最大值最小。我們存圖採用鄰接矩陣和鍊錶兼用法,鄰接矩陣用於跑floyd,鍊錶用於遍歷與某個點直接相連的點。我們首先用floyd處理出各個點之間的距離,備用。接下來我們先找出直徑的長度,這個很好解決,直...

NOIP2007 樹網的核

參考了某位神牛的題解之後才發現原來這道題並不是很難 還是自己太弱了 原來的想法本來是快排找直徑,通過dfs確定在直徑中的點,然後再分別列舉每兩個點形成的邊,以邊的兩點做floyd通過打擂台確定偏心距。自己的想法真的很麻煩而且就算編出來少說也要200 行的 這在比賽中是不可能也是做不到的。正規且高效的...

NOIp 2007 樹網的核

問題描述 設 t v,e,w 是乙個無圈且連通的無向圖 也稱為無根樹 每條邊帶有正整數的權,我 們稱t 為樹網 treenetwork 其中v,e分別表示結點與邊的集合,w 表示各邊長度的集合,並設t 有n個結點。路徑 樹網中任何兩結點a,b 都存在唯一的一條簡單路徑,用d a,b 表示以a,b 為...