• [cogs1065]绿豆蛙的归宿


    1065. [Nescafe19] 绿豆蛙的归宿

    【题目描述】

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

    【输入格式】

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

    【输出格式】

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

    【输入样例】

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

    【输出样例】

     7.00

     

    【数据范围】

    时间限制:1 s   内存限制:128 MB

    对于20%的数据   N<=100

    对于40%的数据   N<=1000
    对于60%的数据   N<=10000
    对于100%的数据  N<=100000,M<=2*N

    题解:

    由于要讲课所以回来补一下坑……这题是一道概率的入门题啊……

    设f[i]为从i走到终点的期望步数,显然f[n]=0;

    我们考虑期望的线性性,由某个点i走到终点的期望步数f[i]应该等于Σ(f[j]+(j->i边权/j点出度),j->i有边)

    我们建立反图递归求,最后求出的f[1]即为所求。

    代码见下:

     1 #include<cstdio> 
     2 #include<cstring>
     3 #include<queue>
     4 using namespace std;
     5 const int N=100000;
     6 int n,m,e;
     7 queue<int>q;
     8 int rudu[N+100],tmp[N+100],chudu[N+100],adj[N+100];
     9 double f[N+100];
    10 struct node{int zhong,next;double val;}s[N*2+100];
    11 inline void add(int qi,int zhong,double val)
    12 {
    13     s[++e].zhong=zhong;s[e].val=val;
    14     s[e].next=adj[qi];adj[qi]=e;
    15 }
    16 int main()
    17 {
    18     //freopen("Lex.txt","r",stdin);
    19     freopen("ldfrog.in","r",stdin);
    20     freopen("ldfrog.out","w",stdout);
    21     scanf("%d%d",&n,&m);
    22     int a,b;double c;
    23     for(int i=1;i<=m;i++)
    24         scanf("%d%d%lf",&a,&b,&c),rudu[a]++,chudu[b]++,add(b,a,c); 
    25     q.push(n);
    26     for(int i=1;i<=n;i++)tmp[i]=rudu[i];
    27     while(!q.empty())
    28     {
    29         int rt=q.front();q.pop();
    30         for(int i=adj[rt];i;i=s[i].next)
    31         {
    32             int u=s[i].zhong;tmp[u]--;
    33             f[u]+=(f[rt]+s[i].val)/rudu[u];
    34             if(tmp[u]==0)q.push(u);
    35         }
    36     }
    37     printf("%.2lf",f[1]);
    38 }
    COGS1065
  • 相关阅读:
    我是来讲笑话的
    dom4j读取xml
    Mysql常用命令
    如何快速开发小型系统
    Spring aop的实现原理
    Spring IOC容器解析及实现原理
    如何编写更棒的代码
    Git使用教程
    关于程序员吃青春饭问题之探讨
    如何自学编程
  • 原文地址:https://www.cnblogs.com/LadyLex/p/7171567.html
Copyright © 2020-2023  润新知