景點中心 蒟蒻的小題解

2021-10-09 02:23:13 字數 2797 閱讀 9725

話說寧波市的中小學生在鎮海中學參加計算機程式設計比賽,比賽之餘,他們在鎮海中學的各個景點參觀。鎮海中學共有n個景點,每個景點均有若干學生正在參觀。這n個景點以自然數1至n編號,每兩個景點的編號均不同。每兩個景點之間有且只有一條路徑。選擇哪個景點集中的學生,才能使所有學生走過的路徑之和最小呢?

如果存在多個解,則輸出距離1最近的那個點,可以證明答案唯一

輸入檔案center.in中有若干行:

第一行只有乙個正整數n,表示景點數。

第二行有n個1至1000間的整數,這n個整數間互相以乙個空格分隔。其中第i個整數表示第i個景點處的學生數。

第三行至第n+1行,每行有三個整數i,j,k,表示景點i和景點j之間有一條長尾k的路徑直接連線。其中i<>j,1≤i≤n,1≤j≤n;1≤k≤1000。

輸出檔案center.out中有二行;

第一行只有乙個整數i,表示在第i個景點處集中時,所有學生走過的路徑之和最短。

第二行也只有乙個整數,表示所有學生走過的路徑之和的最小值。

43 2 4 1

1 2 5

3 1 6

2 4 4143

【資料限制】

所有的資料均隨機生成,且滿足:

30%的資料,1≤n≤200。

60%的資料,1≤n≤3000。

100%的資料,1≤n≤100000。

本題一看就是樹形dp了吧。。。

好的,考慮怎麼dp。

我們記f[x

]f[x]

f[x]

為他所有子節點到他的距離。

然後記f1[

x]

f1[x]

f1[x

]表示他到根節點的距離。

最後記num

[x

]num[x]

num[x]

表示他子節點的數量。

先用一次dfs預處理出三個值,然後考慮dp。

a ns

[st]

=∑(f

[v]−

(f[x

]+nu

m[x]

∗(f1

[x]−

f1[v

])))

+((n

um[v

]−nu

m[x]

)∗(f

1[st

]−f1

[v])

);

ans[st]=\sum(f[v]-(f[x]+num[x]*(f1[x]-f1[v])))+((num[v]-num[x])*(f1[st]-f1[v]));

ans[st

]=∑(

f[v]

−(f[

x]+n

um[x

]∗(f

1[x]

−f1[

v]))

)+((

num[

v]−n

um[x

])∗(

f1[s

t]−f

1[v]

));結合**理解:

long

longdp(

int x)

return s+f[st]

;}

看不懂的自己yy一下吧,手模一下就懂了。

最後的答案便為:min

(ans

[i]+

f[i]

)min(ans[i]+f[i])

min(an

s[i]

+f[i

])了。最後放出完整的code。

專用水印啊!!!!!!!!!!!!!!!!!!!

#include

//萬能頭nb!

using

namespace std;

int tot,head[

200005

],len[

200005

],next[

200005

],g[

200005

],a[

100005

],n,fa[

100005];

long

long num[

100005

],f1[

100005

],f[

100005];

intread()

//快讀

int s=0;

while

(ch>=

'0'&&ch<=

'9')

return s;

}void

add(

int x,

int y,

int z)

voiddg(

int x)}}

long

longdp(

int x)

return s+f[st];}

intmain()

for(

register

int i=

1;i<=n-

1;i++)dg

(1);

long

long ans=

0x3f3f3f3f3f3f3f

;int t=0;

for(

register

int i=

1;i<=n;i++)}

printf

("%d\n%lld"

,t,ans)

;}

時間複雜度:o(n

logn

)o(n logn )

o(nlog

n)

1497 景點中心

話說寧波市的中小學生在鎮海中學參加計算機程式設計比賽,比賽之餘,他們在鎮海中學的各個景點參觀。鎮海中學共有n個景點,每個景點均有若干學生正在參觀。這n個景點以自然數1至n編號,每兩個景點的編號均不同。每兩個景點之間有且只有一條路徑。選擇哪個景點集中的學生,才能使所有學生走過的路徑之和最小呢?如果存在...

jzoj1497 景點中心

話說寧波市的中小學生在鎮海中學參加計算機程式設計比賽,比賽之餘,他們在鎮海中學的各個景點參觀。鎮海中學共有n個景點,每個景點均有若干學生正在參觀。這n個景點以自然數1至n編號,每兩個景點的編號均不同。每兩個景點之間有且只有一條路徑。選擇哪個景點集中的學生,才能使所有學生走過的路徑之和最小呢?如果存在...

jzoj1497 景點中心

話說寧波市的中小學生在鎮海中學參加計算機程式設計比賽,比賽之餘,他們在鎮海中學的各個景點參觀。鎮海中學共有n個景點,每個景點均有若干學生正在參觀。這n個景點以自然數1至n編號,每兩個景點的編號均不同。每兩個景點之間有且只有一條路徑。選擇哪個景點集中的學生,才能使所有學生走過的路徑之和最小呢?如果存在...