話說寧波市的中小學生在鎮海中學參加計算機程式設計比賽,比賽之餘,他們在鎮海中學的各個景點參觀。鎮海中學共有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編號,每兩個景點的編號均不同。每兩個景點之間有且只有一條路徑。選擇哪個景點集中的學生,才能使所有學生走過的路徑之和最小呢?如果存在...