• 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;

           }

    }

  • 相关阅读:
    shell中的交互模式:expect
    hive(II)--sql考查的高频问题
    ETL工具--kettle篇(17.10.09更新)
    hive(I)--学习总结之常用技能
    ubantu上搭建hive环境
    shell实例练习+详解
    搭建hadoop、hdfs环境--ubuntu(完全分布式)
    oracle 获取一个字段的年月日
    oracle 两表更新 报错ORA-01779: 无法修改与非键值保存表对应的列
    oracle 查看表空间 添加数据文件
  • 原文地址:https://www.cnblogs.com/csgc0131123/p/5290470.html
Copyright © 2020-2023  润新知