zoukankan      html  css  js  c++  java
  • 31.绿豆蛙的归宿(拓扑排序)

     时间限制: 1 s

     空间限制: 64000 KB

     题目等级 : 黄金 Gold

    题解

    题目描述 Description

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

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

    输入描述 Input Description

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

    输出描述 Output Description

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

    样例输入 Sample Input

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

    样例输出 Sample Output

    7.00

    数据范围及提示 Data Size & Hint

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

    代码:

    (当输入数据数量接近边界最大值时,会超时,要开很大的数组时,最好用动态数组解决,节省时间)

    #include

    using namespace std;

    #include

    #include

    #define maxn 100001

    int rudu[maxn],chudu[maxn],ans[maxn],a,b,c;

    struct Edge{

           int u,v,w,next;

    };

    Edge edge[2*maxn];

    int head[maxn]={0},n,m;

    double sumhope=0,rate[maxn];

    void input();

    void topsort();

    int main()

    {

           input();

           topsort();

           printf("%.2lf",sumhope);

           return 0;

    }

    void topsort()

    {

           int tot=0;

           int t;

           t=0;

           for(int i=1;i<=n;++i)

        if(!rudu[i])

         {

                t++;

                  tot++;

                  rudu[i]=99999;

                  rate[i]=1;

                  ans[t]=i;

              }

           while(tot

           {

                  for(int i=1;i<=t;++i)

                    for(int j=head[ans[i]];j!=0;j=edge[j].next)

                    {

                        rudu[edge[j].v]--;

                        rate[edge[j].v]+=rate[ans[i]]/chudu[ans[i]];

                        sumhope+=(rate[ans[i]]/chudu[ans[i]])*edge[j].w;

                    }

                  t=0;

                  for(int i=1;i<=n;++i)

                         if(!rudu[i])

                         {

                                rudu[i]=99999;

                                t++;

                                tot++;

                                ans[t]=i;

                         }

                 

          

           }

    }

    void input()

    {

           scanf("%d%d",&n,&m);

           for(int i=1;i<=m;++i)

           {

                  scanf("%d%d%d",&a,&b,&c);

                  edge[i].u=a;

                  edge[i].v=b;

                  edge[i].w=c;

                  rudu[b]++;

                  chudu[a]++;

                  edge[i].next=head[a];

                  head[a]=i;

           }

    }

  • 相关阅读:
    BZOJ 3205 [Apio2013]机器人 ——斯坦纳树
    BZOJ 3782 上学路线 ——动态规划 Lucas定理 中国剩余定理
    HDU 1423 Greatest Common Increasing Subsequence ——动态规划
    BZOJ 3309 DZY Loves Math ——莫比乌斯反演
    POJ 1038 Bugs Integrated, Inc. ——状压DP
    POJ 3693 Maximum repetition substring ——后缀数组
    POJ 2699 The Maximum Number of Strong Kings ——网络流
    POJ 2396 Budget ——有上下界的网络流
    BZOJ 4650 [Noi2016]优秀的拆分 ——后缀数组
    源码安装python
  • 原文地址:https://www.cnblogs.com/csgc0131123/p/5290469.html
Copyright © 2011-2022 走看看