樹形dp
orz orz orz orz
orz tunix orz
orz orz orz orz
簡單寫一下,怕自己忘了。。。
先考慮沒有環的情況。
令點1為樹根,設do
wn[i
] 表示從i開始向下走的期望步數,up
[i] 表示往上走的。do
wn[i
] 的計算很簡單: do
wn[i
]=∑(
down
[j]+
w[i]
[j])
son[
i]考慮up
[i] ,點i走到父親f後,可以順著其他的兒子向下走,也可以繼續往上。所以: up
[i]=
len[
i][f
]+do
wn[f
]∗so
n[f]
−dow
n[i]
−len
[f][
i]+u
p[f]
son[
f]−1
+1最後,以每個點為出發點統計答案: an
s=∑n
i=1d
own[
i]∗s
on[i
]+up
[i]s
on[i
]+1n
考慮環呢?注意最多只有乙個環。
不在環上的點一樣算,環上的down也一樣算。
環上的點的up值其實就是沿著環走到其他的任意乙個環上的點,然後再沿外向樹向下走的期望長度。
這一段直接看**吧。
for(int i=1;i<=tot;i++)
k=1;
for(int x=pre[now];x!=now;x=pre[x])
up[now]/=2;
}
兩個並列的迴圈分別是順時針、逆時針,最後/2。k是走到這個點的概率,每次乘以1s
on[x
]+1 .
另外環上的點算是有兩個父親,於是定義pa
[i] 表示i的父親個數,則up
[i] 的式子化為: up
[i]=
len[
i][f
]+do
wn[f
]∗so
n[f]
−dow
n[i]
−len
[f][
i]+u
p[f]
∗fa[
i]so
n[f]
−1+p
a[i]
注意除0!
code:
#include
#include
#include
#define d(x) cout<<#x<<" = "<#define e coutconst
int n = 100005;
int n,m,flag,tot; double up[n],down[n]; bool bo[n];
int len[21][21],cir[21],id[n],pre[n],nxt[n],fa[n],son[n];
struct edge e[n*2];
int head[n], ec=0;
void add(int a,int b,int w)
void findcir(int u,int f)
findcir(v,u);
if(flag>0)
if(flag==-1) break;
}bo[u]=false;
}void dfscir(int u,int f)
} void dfsdown(int u,int f)
if(son[u]) down[u]/=son[u];
}void dfsup(int u,int f,int w)
for(int i=head[u];i;i=e[i].next)
}int main()
if(m1,0);
for(int i=head[1];i;i=e[i].next)
dfsup(e[i].to,1,e[i].w);
}else
}// for(int i=1;i<=n;i++) }
for(int i=1;i<=tot;i++)
for(int i=1;i<=tot;i++)
k=1;
for(int x=pre[now];x!=now;x=pre[x])
up[now]/=2;
}for(int j=1;j<=tot;j++)
}// for(int i=1;i<=n;i++) d(down[i]), e;
// for(int i=1;i<=n;i++) d(up[i]), e;
double ans=0;
for(int i=1;i<=n;i++) ans+=(up[i]*fa[i]+down[i]*son[i])/(fa[i]+son[i]);
printf("%.5f\n",ans/n);
}
bzoj2878 Noi2012 迷失遊樂園
題目鏈結 求基環樹上以任意點為起點的簡單路徑期望長度。啊啊啊好醜陋。右轉題解 lcf 注意特判環上最後乙個點,以及算up的時候是否是根節點。bzoj2878 include include include include include include include define ll long ...
bzoj2876 Noi2012 騎行川藏
蛋蛋非常熱衷於挑戰自我,今年暑假他準備沿川藏線騎著自行車從成都前往拉薩。川藏線的沿途有著非常美麗的風景,但在這一路上也有著很多的艱難險阻,路況變化多端,而蛋蛋的體力十分有限,因此在每天的騎行前設定好目的地 同時合理分配好自己的體力是一件非常重要的事情。由於蛋蛋裝備了一輛非常好的自行車,因此在騎行過程...
BZOJ2876 Noi2012 騎行川藏
作者部落格 蛋蛋非常熱衷於挑戰自我,今年暑假他準備沿川藏線騎著自行車從成都前往拉薩。川藏線的沿途有著非常美麗的風景,但在這一路上也有著很多的艱難險阻,路況變化多端,而蛋蛋的體力十分有限,因此在每天的騎行前設定好目的地 同時合理分配好自己的體力是一件非常重要的事情。由於蛋蛋裝備了一輛非常好的自行車,因...