首页 > 其他分享 >217. 绿豆蛙的归宿

217. 绿豆蛙的归宿

时间:2022-12-06 10:15:13浏览次数:67  
标签:217 归宿 idx int 绿豆蛙 long le define

题目链接

217. 绿豆蛙的归宿

给出一个有向无环的连通图,起点为 \(1\),终点为 \(N\),每条边都有一个长度。

数据保证从起点出发能够到达图中所有的点,图中所有的点也都能够到达终点。

绿豆蛙从起点出发,走向终点。

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

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

输入格式

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

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

输出格式

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

数据范围

\(1 \le N \le 10^5\),
\(1 \le M \le 2N\)

输入样例:

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

输出样例:

7.00

解题思路

概率dp

状态表示:\(f[i]\) 表示 \(i\sim n\) 的期望长度
状态计算:反向建边,假设已经求得 \(f[i]\) 的期望长度,需要求解其连向边权为 \(w\) 的 \(j\) 这个点的期望,计算一开始时 \(j\) 这个点的出边有 \(d\) 条,则对于 \(j\) 来说,\(i\) 到 \(j\) 这条边的期望贡献为 \(\frac{f[i]+w}{d}\),按照拓扑排序更新状态即可

另外题目保证出度为 \(0\) 的点有且仅有 \(n\) 这一个点,即假设还存在一个出度为 \(0\) 的点,又由于这样的图是一个 dag,所有这样的点到达不了 \(n\),与题意矛盾,故出度为 \(0\) 的点仅有 \(n\) 这一个点

  • 时间复杂度:\(O(n+m)\)

代码

// Problem: 绿豆蛙的归宿
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/219/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

// %%%Skyqwq
#include <bits/stdc++.h>
 
//#define int long long
#define help {cin.tie(NULL); cout.tie(NULL);}
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
using namespace std;
 
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
 
template <typename T> bool chkMax(T &x, T y) { return (y > x) ? x = y, 1 : 0; }
template <typename T> bool chkMin(T &x, T y) { return (y < x) ? x = y, 1 : 0; }
 
template <typename T> void inline read(T &x) {
    int f = 1; x = 0; char s = getchar();
    while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); }
    while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();
    x *= f;
}

const int N=1e5+5,M=2*N;
int n,m,d[N],din[N];
int h[N],w[M],ne[M],e[M],idx;
double f[N];
bool v[N];
void add(int a,int b,int c)
{
	e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
int main()
{
	memset(h,-1,sizeof h);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
    	int x,y,z;
    	scanf("%d%d%d",&x,&y,&z);
    	d[x]++;
    	add(y,x,z);
    	din[x]++;
    }
    f[n]=0;
    queue<int> q;
    q.push(n);
    while(q.size())
    {
    	int x=q.front();
    	q.pop();
    	for(int i=h[x];~i;i=ne[i])
    	{
    		int y=e[i];
    		f[y]+=(f[x]+w[i])/d[y];
    		if(--din[y]==0)q.push(y);
    	}
    }
	printf("%.2lf",f[1]);
    return 0;
}

标签:217,归宿,idx,int,绿豆蛙,long,le,define
From: https://www.cnblogs.com/zyyun/p/16954376.html

相关文章

  • 2174. 费用流
    题目链接2174.费用流给定一个包含\(n\)个点\(m\)条边的有向图,并给定每条边的容量和费用,边的容量非负。图中可能存在重边和自环,保证费用不会存在负环。求从\(S\)......
  • 2176. 太空飞行计划问题
    题目链接2176.太空飞行计划问题\(W\)教授正在为国家航天中心计划一系列的太空飞行。每次太空飞行可进行一系列商业性实验而获取利润。现已确定了一个可供选择的实验......
  • 2173. Dinic/ISAP求最小割
    题目链接2173.Dinic/ISAP求最小割给定一个包含\(n\)个点\(m\)条边的有向图,并给定每条边的容量,边的容量非负。图中可能存在重边和自环。求从点\(S\)到点\(T\)的......
  • 【LeetCode】NO.217存在重复元素
    题目:给你一个整数数组 nums 。如果任一值在数组中出现至少两次,返回 true ;如果数组中每个元素互不相同,返回 false 。示例1:输入:nums=[1,2,3,1]输出:true示例2:......
  • 洛谷刷题_P217 [USACO1.5]回文质数 Prime Palindromes
    题目P217[USACO1.5]回文质数PrimePalindromes题目链接https://www.luogu.com.cn/problem/P1217知识点埃氏筛原理:要得到自然数n以内的全部素数,必须把不大于根号n......
  • 217. 存在重复元素
    给你一个整数数组nums。如果任一值在数组中出现至少两次,返回true;如果数组中每个元素互不相同,返回false。示例1:输入:nums=[1,2,3,1]输出:true示例2:输入:nums=......
  • TPS65217DRSLR TPS65217 便携式设备 电源管理IC 48VQFN
    规格参数型号:TPS65217TPS65217DRSLR应用:电池管理,显示器(LED驱动器),手持/移动设备,电源电流-供电:-电压-供电:2.75V~5.8V工作温度:-40°C~105°C安装类型:表面贴装型封......
  • macOS Monterey 12.6.1 (21G217) Boot ISO 原版可引导镜像
    macOSMonterey12.6+,皆为安全更新,不再赘述。macOSMonterey12.6,发布于2022年9月12日(北京时间今日凌晨),本次为安全更新。今日(2022-07-21)凌晨,Apple终于发布了macO......
  • CF 217A (森林数)
    求森林数,裸的并查集Programc;varn,i,j,ans:longint;map:array[1..100,1..2]oflongint;f:array[1..100]oflongint;functiongetfather(a:longint):longint;beg......
  • HTL6217系列可用5节 ~7节电池的串联连接
    概述HTL6217系列内置高精度电压检测电路和延迟电路,是用于锂离子可充电电池的二次保护IC。通过将各节电池间短路,可适用于5节 ~7节电池的串联连接。封装MSOP-10特点1、针对各......