bzoj1999 樹網的核

2022-03-30 14:13:03 字數 2813 閱讀 7537

從下午坑到網上。。noip的資料太弱,若干的地方寫掛結果還隨便過= =

最坑的就是網上有些題解沒考慮周全。。。

第一步是找直徑,用兩次bfs(或者dfs,linux下系統棧挺大的。。

)解決。找出其中一條直徑就可以了,雖然蒟蒻不會證明但是看起來似乎挺有道理的

要看證明的話可以看這個題解:

直徑上的路徑本來有n^2條,但是我們發現,首先對於同一起點/終點的路徑,路徑長度越長(合法的前提下)偏心距肯定越小,但是路徑又有長度的約束,所以可以用單調佇列來優化。

假設直徑兩端點為x,y,對於一條路徑(a,b),離路徑最遠的點要麼是x和y中的乙個,要麼是 a到b的路徑上的節點中 不走直徑

能到達的最遠的節點。

假設x離a比較近,b離y比較近,如果有不在直徑上的節點k使得dist(k,a)>dist(x,a)的話,那麼(x,y)就不是直徑了((k,a)(a,y)可以拼成更長的一條路徑);對於b同理

但是需要注意的是,以上的k節點必須滿足 k到路徑最近的點是路徑的端點。。。

不然的話假設k到路徑最近的點為c,那麼dis(c,k)也有可能是偏心距。。。最直觀的例子是給定的s比直徑長度還大,那樣偏心距就全得靠k了。。

當然了noip資料足夠水noip資料足夠水noip資料足夠水所以。。。

單調佇列的話蒟蒻弄了兩個單調佇列,乙個是遞增地儲存x到路徑上的節點的距離,另乙個遞減地儲存路徑上的點到 其他節點(具體看上面)最遠的距離。。。

當然了因為第乙個單調佇列每次刪掉非法的隊頭後只要直接在隊尾入隊,所以實際上可以不用開佇列,只要記錄隊頭隊尾的位置就好了= =

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7const

int maxn=500233;8

struct

edgee[maxn<<1

];11

struct

zsdll[maxn],q[maxn];

14int

last[maxn],num[maxn],dl[maxn],f[maxn],p[maxn];

15int dist[4

][maxn];

16int

i,j,k,a,b;

17int

n,m,l,r,now,tot,posa,posb,s,c,ans,l1,r1;

18bool

u[maxn],arr[maxn],cant[maxn];

1920

21 inline void insert(int a,int b,int c)

24void bfs(int st,int ed,int

id)32}33

}34 memset(u,0,sizeof

(u));

35if(id==3)40

}41void bii(int

x)47}48

intmain()

66 printf("

%d\n

",ans);

67return0;

68 }

view code

//因為改了很多遍,所以程式裡面有很多沒用的陣列(捂臉)

為何b站上面的noip題都如此喪心病狂。。qaq

time limit: 10 sec  memory limit: 64 mb

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

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

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為樹網結點的個數,s為樹網的核的長度的上界。設結點編號依次為1, 2, ..., n。 從第2行到第n行,每行給出3個用空格隔開的正整數,依次表示每一條邊的兩個端點編號和長度。例如,「2 4 7」表示連線結點2與4的邊的長度為7。 所給的資料都是正確的,不必檢驗。

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

5 21 2 5

2 3 2

2 4 4

2 5 3

5對於70%的資料,n<=200000

對於100%的資料:n<=500000, s<2^31, 所有權值<500

*********************************************=

似乎spoj上加強版的資料...

BZOJ1999 noip2007樹網的核

time limit 10 sec memory limit 64 mb submit 1756 solved 536 submit status discuss 設t v,e,w 是乙個無圈且連通的無向圖 也稱為無根樹 每條邊帶有正整數的權,我們稱t為樹網 treenetwork 其中v,e分別表...

BZOJ 1099 樹網的核

題面 搞了三個多小時。noip時的資料很水,直接暴力n 3過。我們考慮優化,首先可以貪心,我們要在直徑上選肯定越插長越好,所以n 2其實就可以解決。但這還不夠,根據直徑的最長性,我們可以用乙個單調佇列優化。include include include include include using n...

BZOJ 1099 樹網的核

題面 搞了三個多小時。noip時的資料很水,直接暴力n 3過。我們考慮優化,首先可以貪心,我們要在直徑上選肯定越插長越好,所以n 2其實就可以解決。但這還不夠,根據直徑的最長性,我們可以用乙個單調佇列優化。include include include include include using n...