列表

详情


NC51070. 绿豆蛙的归宿

描述

背景

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

描述

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

输入描述

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

第二行到第 1+M 行: 每行3个整数 a b c,代表从a到b有一条长度为c的有向边

输出描述

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

示例1

输入:

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

输出:

7.00

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 94ms, 内存消耗: 11628K, 提交时间: 2020-03-03 11:47:43

#include<bits/stdc++.h>
using namespace std;
const int size=1e5+5;
typedef pair<int,int> pii;
int du[size],in[size];
vector<pii> G[size];
queue<int> q;
double ans[size];
int main()
{
	int n,m,a,b,c;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		G[b].push_back(pii(a,c));
		du[a]++;
		in[a]++;
	}
	q.push(n);
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(auto p:G[u])
		{
			int w=p.second,v=p.first;
			ans[v]+=(ans[u]+w)/(1.0*in[v]);
			du[v]--;
			if(!du[v]) q.push(v);
			
		}
	}
	printf("%.2f",ans[1]);
}

C++14(g++5.4) 解法, 执行用时: 75ms, 内存消耗: 11628K, 提交时间: 2019-10-09 14:13:11

#include<bits/stdc++.h>
using namespace std;
const int size=1e5+5;
typedef pair<int,int> pii;
int du[size],in[size];
vector<pii> G[size];
queue<int> q;
double ans[size];
int main()
{
	int n,m,a,b,c;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		G[b].push_back(pii(a,c));
		du[a]++;in[a]++;
	}
	q.push(n);
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(auto p:G[u])
		{
			int w=p.second,v=p.first;
			ans[v]+=(ans[u]+w)/(1.0*in[v]);
			du[v]--;
			if(!du[v]) q.push(v);
		}
	}
	printf("%.2f",ans[1]);
}
	

上一题