BZOJ 2878 迷失游乐园
http://www.lydsy.com/JudgeOnline/problem.php?id=2878
题意:n个点的图,保证图联通,有n-1或者n条边,求从任意一个点出发,不经过相同点,最终无路可走的路径长度期望。
思路:m=n-1时,可以用dp,处理出i点往下,i点往上走的路径长度期望,然后O(n)统计就可以了。
m=n时,由于环上点点数不超过20,那这就是基环树,我们考虑枚举基环树上面的点i,假设我们到了i,并走向了i的子树。
这样我们就把环断开了,然后我们再两遍顺逆走这个环,就可以处理出up数组了,然后再分别下传到每个子树里。
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
int flag,n,m,f[],len[],vis[],tot,go[],next[],cnt,cir[],huan[],first[],val[],du[];
double down[],up[];
int read(){
char ch=getchar();int t=,f=;
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
void insert(int x,int y,int z){
tot++;
go[tot]=y;
next[tot]=first[x];
first[x]=tot;
val[tot]=z;
}
void add(int x,int y,int z){
insert(x,y,z);insert(y,x,z);
}
void dfs1(int x,int fa){
vis[x]=;
for (int i=first[x];i;i=next[i]){
int pur=go[i];
if (vis[pur]) continue;
dfs1(pur,x);
down[x]+=(double)val[i]+(((double)down[pur])/((double)(du[pur]-+(du[pur]==))));
}
}
void dfs2(int x,int fa){
if (!cir[x]&&fa!=) up[x]=len[x]+((double)((double)up[fa]+down[fa]-len[x]-((double)down[x])/((double)du[x]-+(du[x]==))))/((double)(du[fa]-+(du[fa]==)));
vis[x]=;
for (int i=first[x];i;i=next[i]){
int pur=go[i];
if (vis[pur]) continue;
f[pur]=x;
len[pur]=val[i];
dfs2(pur,x);
}
}
void work1(){
dfs1(,);
for (int i=;i<=n;i++) vis[i]=;
dfs2(,);
double ans=;
for (int i=;i<=n;i++) ans+=((double)down[i]+(double)up[i])/((double)du[i]);
ans/=((double)(n));
printf("%.5f\n",ans);
}
void dfs(int x,int fa){
vis[x]=;
for (int i=first[x];i;i=next[i]){
int pur=go[i];
if (flag) return;
if (f[x]!=pur&&vis[pur]){
len[pur]=val[i];
int j=x;
while (j!=f[pur]){
cnt++;
cir[j]=;
huan[cnt]=j;
j=f[j];
}
flag=;
return;
}else if (!vis[pur]){
len[pur]=val[i];
f[pur]=x;
dfs(pur,x);
}
}
}
void work2(){
flag=;
dfs(,);cnt++;
for (int i=;i<=n;i++) vis[i]=;
for (int i=;i<cnt;i++) vis[huan[i]]=;
for (int i=;i<cnt;i++) dfs1(huan[i],);
for (int i=;i<cnt;i++){
int x=(i+)%cnt;double s=;
while (x!=i){
if ((x+)%cnt==i) up[huan[i]]+=(double)s*len[huan[(x-+cnt)%cnt]]+((double)(s*down[huan[x]]))/((double)(du[huan[x]]-+(du[huan[x]]==)));
else up[huan[i]]+=(double)s*len[huan[(x-+cnt)%cnt]]+((double)(s*down[huan[x]]))/((double)(du[huan[x]]-));
s=s/((double)(du[huan[x]]-));
x=(x+)%cnt;
}
x=(i-+cnt)%cnt;s=;
while (x!=i){
if ((x-+cnt)%cnt==i) up[huan[i]]+=(double)s*len[huan[x]]+((double)(s*down[huan[x]]))/((double)(du[huan[x]]-+(du[huan[x]]==)));
else up[huan[i]]+=(double)s*len[huan[(x)%cnt]]+((double)(s*down[huan[x]]))/((double)(du[huan[x]]-));
s=s/((double)(du[huan[x]]-));
x=(x-+cnt)%cnt;
}
}
for (int i=;i<=n;i++) vis[i]=;
for (int i=;i<cnt;i++) vis[huan[i]]=;
for (int i=;i<cnt;i++) dfs2(huan[i],);
double ans=;
for (int i=;i<=n;i++) ans+=(down[i]+up[i])/(du[i]);
printf("%.5f\n",ans/n);
}
int main(){
cnt=-;
n=read();m=read();flag=;
for (int i=;i<=m;i++){
int x=read(),y=read(),z=read();
add(x,y,z);
du[x]++;du[y]++;
}
if (m==n-) work1();
else work2();
}
BZOJ 2878 迷失游乐园的更多相关文章
- 【NOI2012】迷失游乐园
题目链接:迷失游乐园(BZOJ) 迷失游乐园(Luogu) 独立完成的题,写一发题解纪念一波~ 模拟完样例大概可以知道是道树形DP了. 观察数据范围,发现是基环树,至少会有一个环. 先从树的部分开始 ...
- 【BZOJ】【2878】【NOI2012】迷失游乐园
树形+基环树DP/数学期望 然而我并不会做…… 题解戳这里:http://blog.csdn.net/u011265346/article/details/46328543 好吧先考虑一个简单点的,当 ...
- BZOJ 2878: [Noi2012]迷失游乐园( 树形dp )
一棵树的话直接树形dp(求出往下走和往上走的期望长度). 假如是环套树, 环上的每棵树自己做一遍树形dp, 然后暴力枚举(环上的点<=20)环上每个点跑经过环上的路径就OK了. -------- ...
- 【BZOJ 2878】 2878: [Noi2012]迷失游乐园 (环套树、树形概率DP)
2878: [Noi2012]迷失游乐园 Description 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m ...
- BZOJ 2878 【NOI2012】 迷失游乐园
题目链接:迷失游乐园 这道题也没有传说中的那么难写吗→_→ 似乎有篇博客讲得特详细……附上链接:戳这里 如果这道题不是基环树,而就是一棵树的话,我们来考虑改怎么做.因为树上的路径只有向上.向下两种走法 ...
- 【BZOJ2878】【NOI2012】迷失游乐园(动态规划)
[BZOJ2878][NOI2012]迷失游乐园(动态规划) 题面 BZOJ 题解 记得以前考试的时候做过这道题目 这题的暴力还是非常显然的,每次\(dfs\)一下就好了. 时间复杂度\(O(n^2) ...
- [bzoj2878][Noi2012]迷失游乐园(基环树dp)
[bzoj2878][Noi2012]迷失游乐园(基环树dp) bzoj luogu 题意:一颗数或是基环树,随机从某个点开始一直走,不走已经到过的点,求无路可走时的路径长期望. 对于一棵树: 用两个 ...
- 「NOI2012」迷失游乐园
「NOI2012」迷失游乐园 题目描述 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩. 进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该 ...
- 2878: [Noi2012]迷失游乐园 - BZOJ
Description 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多有一个环( ...
随机推荐
- Oracle left查询案例
)) summoney from( select t2.ano,d.dmoney from ( select t1.*,c.cno from( select a.ano,b.bno from t_a ...
- bzoj 1912 巡逻(树直径)
Description Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示村庄a与b之间有一条道路(1 ≤ a, b ≤ n). Ou ...
- AOI
AOI(Automatic Optic Inspection)的全称是自动光学检测,是基于光学原理来对焊接生产中遇到的常见缺陷进行检测的设备.AOI是新兴起的一种新型测试技术,但发展迅速,很多厂家都推 ...
- AltiumDesignerSummer9Build9.3.1.19182破解图文教程
一.下载 AltiumDesignerSummer9Build9.3.1.19182 下载地址 http://www.verycd.com/topics/2769819/ 二.安装 一路确定啥的傻瓜式 ...
- Qt5.3企业版和开源版功能区别
一: Charts Charts是QT提供的图表模块.他提供了非常简便的APIs来绘制令人惊叹的Line, Spline,Area,Scatter,Pie,Donut,Bar,Polar和Box-an ...
- 在Visual Studio Express 2013中开发自定义控件
在专业版本中,新建项目时有"Windows Control Library"这样一个类型可以用于新建自定义控件项目. 但是Express版本中,没有这样一个类型可供选择.这里有另外 ...
- 网站10大致命SEO错误
1.关键字堆砌 我想不出有比胡乱将这些复制的内容放在网站上更差劲的事情了.网站复制一遍又一遍,你肯定也不想看到这么差劲的网站复制. 你在明白我在做什么吗?我并不是一个那么差劲的编辑者,我只是想说明一个 ...
- 【shell】构造并遍历二位数组的一种用法
参考shell数组的部分操作用法,实现了构造和遍历二维数组的一种方式,具体如下: #数组元素以空格分割 sites=("www.a.com www.b.com www.c.com www.d ...
- poj 1017 Packets 贪心
题意:所有货物的高度一样,且其底面积只有六种,分别为1*1 2*2 3*3 4*4 5*5 6*6的,货物的个数依次为p1,p2,p3,p4,p5,p6, 包裹的高度与货物一样,且底面积就为6*6,然 ...
- Html 加载音乐代码mp3
<object data="__PUBLIC__/home/mp3/media.mp3" type="application/x-mplayer2" wi ...