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;

       }

}

posted @ 2016-03-01 11:20  csgc0131123  阅读(177)  评论(0编辑  收藏  举报