码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ3036: 绿豆蛙的归宿

时间:2016-08-21 22:54:40      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:

3036: 绿豆蛙的归宿

Time Limit: 2 Sec  Memory Limit: 128 MB
Submit: 362  Solved: 255
[Submit][Status][Discuss]

Description

随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿。

给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度。绿豆蛙从起点出发,走向终点。
到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为 1/K 。
现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少?

Input

第一行: 两个整数 N M,代表图中有N个点、M条边
第二行到第 1+M 行: 每行3个整数 a b c,代表从a到b有一条长度为c的有向边

Output


从起点到终点路径总长度的期望值,四舍五入保留两位小数。

 

Sample Input

4 4
1 2 1
1 3 2
2 3 3
3 4 4

Sample Output

7.00

HINT

 



对于100%的数据  N<=100000,M<=2*N

 

Source

题解:水题我爱刷!

技术分享
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#define ll long long 
#define N 100005
#define M 200005
using namespace std;
int d[N];
int pre[M],now[N],v[M],val[M];
double f[N];
bool vis[N];
int n,m,tot;
int read()
{
    int x=0,f=1; char ch;
    while (ch=getchar(),ch<0||ch>9) if (ch==-) f=-1;
    while (x=x*10+ch-0,ch=getchar(),ch>=0&&ch<=9);
    return x*f;
}
void ins(int a,int b,int c)
{
    ++tot; pre[tot]=now[a]; now[a]=tot; v[tot]=b; val[tot]=c;
}
void solve(int x,int fa)
{
    if (!vis[x]) vis[x]=1; else return ;
    for (int p=now[x]; p; p=pre[p])
    {
        int son=v[p]; if (son==fa) continue;
        solve(son,x);
        f[x]+=val[p]+f[son];
    }
    if (d[x]) f[x]=1.0*f[x]/d[x]; 
}
int main()
{
    n=read(); m=read();
    for (int i=1; i<=m; i++)
    {
        int u=read(),v=read(),val=read();
        ins(u,v,val); d[u]++;
    }
    solve(1,0);
    printf("%0.2lf",f[1]);
}
View Code

 

BZOJ3036: 绿豆蛙的归宿

标签:

原文地址:http://www.cnblogs.com/HQHQ/p/5793812.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!