CF1874C Jellyfish and EVA 题解
题意
给定一个有向无环图,对于任意一条边
定义一次从节点
-
选择从 出发的且未被删除的一条边。 -
在从 出发的且未被删除的边中等概率随机选择一条。 -
若两人选择的边相同,则向这条边移动,否则继续选择。
如果不存在从当前节点
若
(
题解
定义
设
可以发现,若
那么采取最优操作的实质即为通过改变操作序列来最大化上述和式的值。
由于在任意一次选择中,每个点被
设
对于
对于
-
若
,那么 从当前的第 优节点转化为 第 优节点,有转移 。 -
若
,那么 从当前的第 优节点转化为 第 优节点,有转移 。
发现具体的转移与
预处理出
Code
#include <bits/stdc++.h>
typedef long long valueType;
typedef std::vector<valueType> ValueVector;
typedef std::vector<ValueVector> ValueMatrix;
typedef long double realType;
typedef std::vector<realType> RealVector;
typedef std::vector<RealVector> RealMatrix;
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
valueType T;
std::cin >> T;
for (int testcase = 0; testcase < T; ++testcase) {
valueType N, M;
std::cin >> N >> M;
RealMatrix G(N + 1, RealVector(N + 1, 0));
for (valueType i = 1; i <= N; ++i) {
G[i][1] = (realType) 1 / i;
for (valueType j = 2; j <= i && i - 2 > 0; ++j)
G[i][j] = G[i - 2][j - 2] * (j - 2) / i + G[i - 2][j - 1] * (i - j) / i;
}
ValueMatrix Graph(N + 1);
for (valueType i = 0; i < M; ++i) {
valueType u, v;
std::cin >> u >> v;
Graph[u].push_back(v);
}
RealVector F(N + 1, 0);
F[N] = 1;
for (valueType i = N - 1; i >= 1; --i) {
auto const degree = (valueType) Graph[i].size();
RealVector to;
to.reserve(degree);
for (auto const &iter: Graph[i])
to.push_back(F[iter]);
std::sort(to.begin(), to.end(), std::greater<>());
F[i] = 0;
for (valueType j = 1; j <= degree; ++j)
F[i] += G[degree][j] * to[j - 1];
}
std::cout << std::fixed << std::setprecision(10) << F[1] << std::endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?