codevs 3279 奶牛健美操

2022-07-21 21:15:44 字數 3745 閱讀 6487

usaco

時間限制: 2 s

空間限制: 256000 kb

題目等級 : 鑽石 diamond

farmer john為了保持奶牛們的健康,讓可憐的奶牛們不停在牧場之間

的小路上奔跑。這些奶牛的路徑集合可以被表示成乙個點集和一些連線

兩個頂點的雙向路,使得每對點之間恰好有一條簡單路徑。簡單的說來,

這些點的布局就是一棵樹,且每條邊等長,都為1。

對於給定的乙個奶牛路徑集合,精明的奶牛們會計算出任意點對路徑的最大值,

我們稱之為這個路徑集合的直徑。如果直徑太大,奶牛們就會拒絕鍛鍊。

farmer john把每個點標記為1..v (2 <= v <= 100,000)。為了獲得更加短

的直徑,他可以選擇封鎖一些已經存在的道路,這樣就可以得到更多的路徑集合,

從而減小一些路徑集合的直徑。

我們從一棵樹開始,fj可以選擇封鎖s (1 <= s <= v-1)條雙向路,從而獲得

s+1個路徑集合。你要做的是計算出最佳的封鎖方案,使得他得到的所有路徑集合

直徑的最大值盡可能小。

farmer john告訴你所有v-1條雙向道路,每條表述為:頂點a_i (1 <= a_i <= v)

和 b_i (1 <= b_i <= v; a_i!= b_i)連線。

我們來看看如下的例子:

線性的路徑集合(7個頂點的樹)

1---2---3---4---5---6---7

如果fj可以封鎖兩條道路,他可能的選擇如下:

1---2 | 3---4 | 5---6---7

這樣最長的直徑是2,即是最優答案(當然不是唯一的)。

輸入描述 input description

* 第1行: 兩個空格分隔的整數v和s

* 第2...v行: 兩個空格分隔的整數a_i和b_i

輸出描述 output description

* 第1行:乙個整數,表示fj可以獲得的最大的直徑。

樣例輸入 sample input

7 2

6 7

3 4

6 5

1 2

3 2

4 5

樣例輸出 sample output

2

資料範圍及提示 data size & hint

對於50%的資料,滿足v<=100;

對於100%的資料,滿足v<=100000

/*

二分答案+樹形dp

codevs 乙個點re 估計是爆棧

bzoj 過了

*/#include

#include

#include

#include

#define maxn 100010

using

namespace

std;

intn,s,topt,l,r,ans,sum;

intfirst[maxn];

priority_queue

q[maxn];

struct

edge

e[maxn*2

];int

init()

while(c>='

0'&&c<='9')

return x*f;

}void add(int x,int

y)int dfs(int x,int

from,int

limit)

while(1

)

}return

q[x].top();

}int judge(int

x)int

main()

l=0,r=n;

while(l<=r)

else l=mid+1

; }

printf(

"%d\n

",ans);

return0;

}

/*

陣列版本 竟然跑得更快 而且不爆棧

*/#include

#include

#include

#include

#include

#define maxn 100010

using

namespace

std;

intn,s,topt,l,r,ans,sum;

intfirst[maxn];

intf[maxn],a[maxn];

struct

edge

e[maxn*2

];int

init()

while(c>='

0'&&c<='9')

return x*f;

}void add(int x,int

y)void dfs(int x,int

from,int

limit)

for(int i=first[x];i;i=e[i].next)

sort(a+1,a+tot+1

);

while(tot>0&&a[tot]+a[tot-1]>limit)tot--,sum++;

f[x]=a[tot];

}int judge(int

x)int

main()

l=0,r=n;

while(l<=r)

else l=mid+1

; }

printf(

"%d\n

",ans);

return0;

}

CODEVS 3279 奶牛的健美操

usaco 時間限制 2 s 空間限制 256000 kb 題目等級 鑽石 diamond farmer john為了保持奶牛們的健康,讓可憐的奶牛們不停在牧場之間 的小路上奔跑。這些奶牛的路徑集合可以被表示成乙個點集和一些連線 兩個頂點的雙向路,使得每對點之間恰好有一條簡單路徑。簡單的說來,這些點...

Codevs 4246 奶牛的身高

codevs 傳送門 題目描述 description 奶牛們在fj的養育下茁壯成長。這天,fj給了奶牛bessie乙個任務,去看看每個奶牛場中若干只奶牛的身高,由於bessie是只奶牛,無法直接看出第i只奶牛的身高,而只能看出第i只奶牛與第j只奶牛的身高差,其中第i 只奶牛與第j只奶牛的身高差為a...

CodeVS4246 奶牛的身高

注 hj hi a 注意t1的樣例 注意注意注意 重要的事情說三遍。第一行為乙個正整數w,表示有w組資料,即w個奶牛場,需要你判斷。每組資料的第一行為兩個正整數n和m,分別表示對應的奶牛場中的奶牛隻數以及看了多少個對奶牛身高差。接下來的m行表示bessie看m次後傳回給fj的m條資訊,每條資訊佔一行...