bzoj-2878(外向树DP)

2878: [Noi2012]迷失游乐园

Time Limit: 10 Sec   Memory Limit: 512 MBSec   Special Judge
Submit: 338   Solved: 238
[ Submit][ Status]

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.00000000

【样例解释】样例数据中共有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 
 

这题真不错,被他折磨了好久~先看是颗树的情况,用DOWN和UP分别表示从当前节点向下和向上走的期望长度,则有
 DOWN[I]=SIGMA{(DIS[I,J]+DOWN[J])/totson[i]};
 UP[i]:=DIS[I,J]+(down[j]*totson[j]-(down[i]+dis[i,j])+up[j])/totson[j];
O(N)可以求出所有的UP DOWN,然后计算统计平均值就行了。
然后是环套树的情况,考虑到只有一个环,且环上点的数量很少,可以把环单独拿出处理,先以每个环上的点为根
求一遍DOWN,然后用O(N^2)的复杂度求出环上每个点的UP值,最后再更新所有树上点的UP值,具体做法有很多种,
我是从每个环上点出发分别求出从左右两个方向的期望长度,最后求出所有的UP和DOWN之后用相同方法求出平均值就行了,
虽然并不难想但处理起来细节还是很多的,很多时候根和环上点都要特殊处理,破坏了整体的美感。。。

你可能感兴趣的:(OI,ACM,DP动态规划,OI,dp)