P4316 绿豆蛙的归宿
题意翻译
「Poetize3」
题目背景
随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿。
题目描述
给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都能够到达终点。绿豆蛙从起点出发,走向终点。 到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为 1/K 。 现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少?
输入输出格式
输入格式:
第一行: 两个整数 N M,代表图中有N个点、M条边 第二行到第 1+M 行: 每行3个整数 a b c,代表从a到b有一条长度为c的有向边
输出格式:
从起点到终点路径总长度的期望值,四舍五入保留两位小数。
输入输出样例
说明
对于20%的数据 N<=100
对于40%的数据 N<=1000
对于60%的数据 N<=10000
对于100%的数据 N<=100000,M<=2*N
//https://www.cnblogs.com/LinnBlanc/p/7763132.html #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> using namespace std; const int N=1e5+5; inline int read() { char c=getchar();int num=0; for(;!isdigit(c);c=getchar()); for(;isdigit(c);c=getchar()) num=num*10+c-'0'; return num; } int n,m; int head[N],num_edge; int rudu[N],chudu[N]; struct Edge { int v,w,nxt; }edge[N<<1]; inline void add_edge(int u,int v,int w) { edge[++num_edge].v=v; edge[num_edge].w=w; edge[num_edge].nxt=head[u]; head[u]=num_edge; } double ans; queue<int> que; double qiw[N]; void topsort() { que.push(1); qiw[1]=1; int now; while(!que.empty()) { now=que.front(),que.pop(); for(int i=head[now],v;i;i=edge[i].nxt) { v=edge[i].v; --rudu[v]; ans+=qiw[now]/chudu[now]*edge[i].w; qiw[v]+=qiw[now]/chudu[now]; if(!rudu[v]) que.push(v); } } } int main() { n=read(),m=read(); for(int i=1,u,v,a;i<=m;++i) { u=read(),v=read(),a=read(); add_edge(u,v,a); ++rudu[v]; ++chudu[u]; } topsort(); printf("%.2lf",ans); return 0; }