您的位置:首页 > 其它

31.绿豆蛙的归宿(拓扑排序)

2016-03-01 11:20 127 查看
时间限制:
1 s

空间限制:
64000 KB

题目等级
: 黄金 Gold

题解


题目描述
Description

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

  给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都能够到达终点。绿豆蛙从起点出发,走向终点。

  到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为 1/K 。

  现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少?


输入描述
Input
Description


  第一行: 两个整数 N M,代表图中有N个点、M条边

  第二行到第 1+M 行: 每行3个整数 a b c,代表从a到b有一条长度为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<=100000,M<=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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: