樹形dp。
這道題的劃分方式和樹鏈剖分類似,但是重路徑能經過根節點,而且要求方案數,所以不能用樹鏈剖分。
但是由這種關係可以知道答案很小為log n級別(翻看資料後,確認了答案最大為4。。但應該有能使答案更大的資料)
用f[i][j][0/1/2]分別表示,以i為子樹的節點中,不便利值最大的點不便利值為j。
0代表i節點不在任何一條兒子構成的鏈中,1表示在一條和兒子構成的鏈中,2代表2條兒子構成的鏈經過了i節點。
(這個很難說明白的感覺。。)
他們之間的遞推關係。。。然後我不會在這個框下面打字了,就在上面解釋。
f1計算出了v[i]能和根節點鏈結的方案數。f2代表了所有不和根節點連線的方案數。
f1=f[v[i]][j][0]+f[v[i]][j][1]f2=(j==0?0:(f[v[i]][j-1][0]+f[v[i]][j-1][1]+f[v[i]][j-1][2
]));
f[u][j][
2]=f[u][j][1]*f1+f[u][j][2]*f2;
f[u][j][
1]=f[u][j][0]*f1+f[u][j][1]*f2;
f[u][j][
0]=f[u][j][0]*f2;
#include#include#include
#define ll long long
using
namespace
std;
const
int maxn = 200000 + 10
;const
int maxh = 12
;int
g[maxn],v[maxn],next[maxn],eid;
long
long f1,f2,f[maxn][maxh][3
],res,mod;
intn,m,ans;
void addedge(int a,int
b) ll update(ll x)
void dfs(int u,int
fa)
}}int
main()
for(int i=1,u,v;i)
for(int i=1;i<=n;i++)
for(int j=0;j)
f[i][j][
0]=1
;
dfs(
1,0);
for(int i=0,res;i)
}return0;
}
bzoj1063 NOI2008 道路設計
time limit 20 sec memory limit 162 mb submit 931 solved 509 submit status discuss description z國坐落於遙遠而又神奇的東方半島上,在小z的統治時代公路成為這裡主要的交通手段。z國共有n座城市,一 些城市之間...
BZOJ1063 NOI2008 道路設計
傳送門 sol 這東西怎麼長了一臉樹鏈剖分的樣子 把公路視為輕邊 發現輕邊的數量是log級別的?dp i j k 表示在節點i,答案為j,這個點向下連 0,1,2 條邊的方案數 直接轉移即可 include using namespace std long long dp 100005 20 4 p...
bzoj1063 Noi2008 道路設計
z國坐落於遙遠而又神奇的東方半島上,在小z的統治時代公路成為這裡主要的交通手段。z國共有n座城市,一些城市之間由雙向的公路所連線。非常神奇的是z國的每個城市所處的經度都不相同,並且最多隻和乙個位於它東邊的城市直接通過公路相連。z國的首都是z國政治經濟文化旅遊的中心,每天都有成千上萬的人從z國的其他城...