一棵树的话直接树形dp(求出往下走和往上走的期望长度). 假如是环套树, 环上的每棵树自己做一遍树形dp, 然后暴力枚举(环上的点<=20)环上每个点跑经过环上的路径就OK了.

---------------------------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
 
using namespace std;
 
const int maxn = 100009;
 
int N, M, C, Root, deg[maxn], L[maxn], R[maxn], Lw[maxn], Rw[maxn];
bool vis[maxn];
double Eu[maxn], Ed[maxn];
 
struct edge {
int t, w;
edge* n;
} E[maxn << 1], *pt = E, *H[maxn];
 
inline void AddEdge(int u, int v, int w) {
deg[pt->t = v]++, pt->w = w, pt->n = H[u], H[u] = pt++;
}
 
void DFS_D(int x) {
vis[x] = true;
Ed[x] = 0;
for(edge* e = H[x]; e; e = e->n) if(!vis[e->t]) {
DFS_D(e->t);
Ed[x] += Ed[e->t] + e->w;
}
if(x == Root) {
Ed[x] /= max(1, (deg[x] - (M < N ? 0 : 2)));
} else if(deg[x] > 1)
Ed[x] /= deg[x] - 1;
}
 
void DFS_U(int x) {
vis[x] = true;
for(edge* e = H[x]; e; e = e->n) if(!vis[e->t]) {
int d = deg[x];
if(x != Root) {
d--;
} else if(M == N)
d -= 2;
double t = (Ed[x] * d - Ed[e->t] - e->w);
if(x == Root) {
if(M < N)
Eu[e->t] = t / max(1, d - 1);
else
Eu[e->t] = (t + Eu[x] * 2) / (d + 1);
} else
Eu[e->t] = (t + Eu[x]) / d;
Eu[e->t] += e->w;
DFS_U(e->t);
}
}
 
void DFS_U(int x, int nxt[], int nxtw[], double &t, int len, double p = 0.5) {
if(nxt[x] != Root) {
t += (Ed[x] + len) * p * (deg[x] - 2) / (deg[x] - 1);
DFS_U(nxt[x], nxt, nxtw, t, len + nxtw[x], p / (deg[x] - 1));
} else
t += (Ed[x] + len) * p;
}
 
bool DFS_C(int x, edge* r = NULL) {
vis[x] = true;
for(edge* e = H[x]; e; e = e->n) if(e != r) {
L[e->t] = x;
R[x] = e->t;
Lw[e->t] = Rw[x] = e->w;
if(vis[e->t]) {
C = e->t;
return true;
}
if(DFS_C(e->t, E + ((e - E) ^ 1))) return true;
}
return false;
}
 
void Init() {
scanf("%d%d", &N, &M);
int u, v, w;
for(int i = 0; i < M; i++) {
scanf("%d%d%d", &u, &v, &w);
u--, v--;
AddEdge(u, v, w);
AddEdge(v, u, w);
}
}
 
void Work() {
double ans = 0;
if(M < N) {
memset(vis, 0, sizeof vis);
DFS_D(Root = 0);
memset(vis, 0, sizeof vis);
Eu[0] = 0;
DFS_U(Root = 0);
ans = Ed[0];
for(int i = 1; i < N; i++)
ans += (Ed[i] * (deg[i] - 1) + Eu[i]) / deg[i];
} else {
memset(vis, 0, sizeof vis);
DFS_C(0);
Root = C;
do {
memset(vis, 0, sizeof vis);
vis[L[Root]] = vis[R[Root]] = true;
DFS_D(Root);
} while((Root = L[Root]) != C);
Root = C;
do {
DFS_U(L[Root], L, Lw, Eu[Root], Lw[Root]);
DFS_U(R[Root], R, Rw, Eu[Root], Rw[Root]);
} while((Root = L[Root]) != C);
Root = C;
do {
memset(vis, 0, sizeof vis);
vis[L[Root]] = vis[R[Root]] = true;
DFS_U(Root);
} while((Root = L[Root]) != C);
memset(vis, 0, sizeof vis);
Root = C;
do {
ans += (Ed[Root] * (deg[Root] - 2) + Eu[Root] * 2) / deg[Root];
vis[Root] = true;
} while((Root = L[Root]) != C);
for(int i = 0; i < N; i++)
if(!vis[i]) ans += (Ed[i] * (deg[i] - 1) + Eu[i]) / deg[i];
}
printf("%.5lf\n", ans / N);
}
 
int main() {
Init();
Work();
return 0;
}

---------------------------------------------------------------------------------------------

2878: [Noi2012]迷失游乐园

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 752  Solved: 443
[Submit][Status][Discuss]

Description

放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩。进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点、m条道路的无向连通图,且该图中至多有一个环(即m只可能等于n或者n-1)。小Z现在所在的大门也正好是一个景点。小Z不知道什么好玩,于是他决定,从当前位置出发,每次随机去一个和当前景点有道路相连的景点,并且同一个景点不去两次(包括起始景点)。贪玩的小Z会一直游玩,直到当前景点的相邻景点都已经访问过为止。小Z所有经过的景点按顺序构成一条非重复路径,他想知道这条路径的期望长度是多少?小Z把游乐园的抽象地图画下来带回了家,可是忘了标哪个点是大门,他只好假设每个景点都可能是大门(即每个景点作为起始点的概率是一样的)。同时,他每次在选择下一个景点时会等概率地随机选择一个还没去过的相邻景点。

Input

第一行是两个整数n和m,分别表示景点数和道路数。 接下来行,每行三个整数Xi, Yi, Wi,分别表示第i条路径的两个景点为Xi, Yi,路径长Wi。所有景点的编号从1至n,两个景点之间至多只有一条道路。

Output

共一行,包含一个实数,即路径的期望长度,保留五位小数

Sample Input

4 3
1 2 3
2 3 1
3 4 4

Sample Output

6.00000

【样例解释】样例数据中共有6条不同的路径: 路径 长度 概率
1-->4 8 1/4
2-->1 3 1/8
2-->4 5 1/8
3-->1 4 1/8
3-->4 4 1/8
4-->1 8 1/4
因此期望长度 = 8/4 + 3/8 + 5/8 + 4/8 + 4/8 + 8/4 = 6.00
【评分方法】本题没有部分分,你程序的输出只有和标准答案的差距不超过0.01时,才能获得该测试点的满分,否则不得分。
【数据规模和约定】对于100%的数据,1 <= Wi <= 100。 测试点编号 n m 备注
1 n=10 m = n-1 保证图是链状
2 n=100 只有节点1的度数大于2
3 n=1000 /
4 n=100000 /
5 n=100000 /
6 n=10 m = n /
7 n=100 环中节点个数<=5
8 n=1000 环中节点个数<=10
9 n=100000 环中节点个数<=15
10 n=100000 环中节点个数<=20

HINT

Source

BZOJ 2878: [Noi2012]迷失游乐园( 树形dp )的更多相关文章

  1. bzoj 2878 [Noi2012]迷失游乐园——树上的期望dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2878 很好的树上概率题的思路,就是分成up和down. 代码中有众多小细节.让我弃疗好几天的 ...

  2. bzoj 2878: [Noi2012]迷失游乐园【树上期望dp+基环树】

    参考:https://blog.csdn.net/shiyukun1998/article/details/44684947 先看对于树的情况 设d[u]为点u向儿子走的期望长度和,du[u]为u点的 ...

  3. bzoj 2878: [Noi2012]迷失游乐园

    #include<iostream> #include<cstring> #include<cstdio> #define M 100005 #define ld ...

  4. bzoj2878 [Noi2012]迷失游乐园 [树形dp]

    Description 放假了,小Z认为呆在家里特别无聊.于是决定一个人去游乐园玩. 进入游乐园后.小Z看了看游乐园的地图,发现能够将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多有一个环 ...

  5. 【BZOJ 2878】 2878: [Noi2012]迷失游乐园 (环套树、树形概率DP)

    2878: [Noi2012]迷失游乐园 Description 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m ...

  6. [luogu2081 NOI2012] 迷失游乐园 (树形期望dp 基环树)

    传送门 题目描述 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩. 进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多有一个环(即m ...

  7. 2878: [Noi2012]迷失游乐园 - BZOJ

    Description 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多有一个环( ...

  8. Luogu P2081 [NOI2012]迷失游乐园 | 期望 DP 基环树

    题目链接 基环树套路题.(然而各种错误调了好久233) 当$m=n-1$时,原图是一棵树. 先以任意点为根做$dp$,求出从每一个点出发,然后只往自己子树里走时路径的期望长度. 接着再把整棵树再扫一遍 ...

  9. BZOJ 2878([Noi2012]-失落的游乐园树DP+出站年轮加+后市展望DP+vector的erase)

    2878: [Noi2012]迷失乐园 Time Limit: 10 Sec  Memory Limit: 512 MBSec  Special Judge Submit: 319  Solved:  ...

随机推荐

  1. 【27前端】背景半透明rgba LESS实践

    今天有看到司徒正美<背景半透明rgba最佳实践>的文章和里面推荐的一个在线工具CSS背景颜色属性值转换  . 于是联系到自己的less库,新技能Get. 内容如下: /*在你的less库中 ...

  2. SET STATISTICS IO和SET STATISTICS TIME 在SQL Server查询性能优化中的作用

    近段时间以来,一直在探究SQL Server查询性能的问题,当然也漫无目的的查找了很多资料,也从网上的大神们的文章中学到了很多,在这里,向各位大神致敬.正是受大神们无私奉献精神的影响,所以小弟也作为回 ...

  3. Oracle如何禁止并行

    PURPOSE -------   To explain how to disable Parallel Execution on Session/System level     SCOPE &am ...

  4. JavaScript 面向对象思想 贪吃蛇游戏

    js代码: 游戏的对象 ,食物,蛇 ,游戏控制思路如下 (完整代码在https://github.com/774044859yf/ObjectSnakeGame下载) var snake = { aS ...

  5. sffs

    因为微软收购了Skype,就减少了对linux版软件的支持,官方下载页面已找不到了.只有这一个地址了.要下的尽早.http://download.skype.com/linux/skype-ubunt ...

  6. eclipse 和myEclipse 项目导入

    经常在eclipse/myeclipse中导入web项目时,出现转不了项目类型的问题,导入后就是一个java项目. 有两种情况: 一.eclipse无法识别其他eclipse的web项目 解决步骤: ...

  7. oracle中的初始化参数文件

    oracle初始化参数文件管理 oracle实例是指运行状态下的oracle软件,是由内存结构跟一些进程结构组成的,主要实现数据库的访问跟控制功能,是oracle的核心. 初始化参数文件是oracle ...

  8. Bootstrap之Button.js

    查看Button.js的源代码 +function ($) { 'use strict'; // BUTTON PUBLIC CLASS DEFINITION // ================= ...

  9. EditText默认不弹出软键盘

    #EditText默认不弹出软键盘# 网上关于EditText默认情况下不弹出软键盘,当手触摸到EditText,获取焦点时候,才会弹出软键盘,貌似都不能用,其实,在oncreate()方法中,加上 ...

  10. python---连接MySQL第一页

    前言:python如果想要连接到MySQL要安装上相关的驱动才下:好在驱动程序在mysql的官网可以下载的到. 以下是我自己保存的一个conetos7版本 http://yunpan.cn/cLACS ...