当前位置: 首页 > web >正文

P3232 [HNOI2013] 游走,solution

原题:

link,点击这里喵。

题意:

给定一个 nnn 个点 mmm 条边的无向连通图,图无重边和自环,顶点从 111 编号到 nnn,边从 111 编号到 mmm

小 Z 在该图上进行随机游走,初始时小 Z 在 111 号顶点,每一步小 Z 以相等的概率随机选择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数。当小 Z 到达 nnn 号顶点时游走结束,总分为所有获得的分数之和。 现在,请你对这 mmm 条边进行编号,使得小 Z 获得的总分的期望值最小。

n≤500n \le 500n500

解法

这种乱动就很烦,考虑通过列出方程式解答。

fif_ifi 为第个 iii 点期望到达的次数,我们有:
fu=(∑v∈outu&v≠nfvdv)+[u=1]f_u=(\sum_{v\in out_u \& v\ne n} \frac{f_v}{d_v} )+[u=1] fu=(voutu&v=ndvfv)+[u=1]
高斯消元即可。

然后就见了。

代码 time ~

#include <bits/stdc++.h>
using namespace std;#define inf 0x3f3f3f3f
typedef long long lnt;namespace DEFINES {
// #define TEST
// #define Debug
#ifdef Debug
#define dprintf(a, ...) printf(a, ##__VA_ARGS__)
#else
#define dprintf(a, ...)
#endif
} // namespace DEFINESstruct my_stream {int x;operator int() {scanf("%d", &x);return x;}
} __rp_read;
#define input() __rp_readconst int N = 300 + 20;double v[N][N]; // data of equations// 约定:
// x 从 1 开始编号
// v[i][n + 1] 存储常数项vector<int> G[N];
int n, m, d[N];
double inv_d[N];struct Edge {int x, y;
} edge[N * N];void init_equations() {           //v[1][n + 1] = 1;              // 哇嗷for (int i = 1; i < n; ++i) { // 注意是 < 号,不能从 n 点获得转移!inv_d[i] = 1.0 / d[i];}for (int i = 1; i <= n; ++i) { //v[i][i] = -1;for (const int &e : G[i]) {v[i][e] = inv_d[e];}}
}void sc() {putchar(10);for (int i = 1; i <= n; ++i) {for (int k = 1; k <= n + 1; ++k) {printf("%8.3lf", v[i][k]);}putchar(10);}putchar(10);
}void solve() {                         //for (int i = 1; i <= n - 1; ++i) { // 这一项包有值的,省去一步for (int e = i + 1; e <= n; ++e) {double r = v[e][i] / v[i][i];for (int k = i; k <= n + 1; ++k) {v[e][k] -= r * v[i][k];}}// sc();}// sc();for (int i = 1; i <= n; ++i) v[i][n + 1] *= -1;for (int i = n; i >= 1; --i) {v[i][n + 1] /= v[i][i];v[i][i] = 1;for (int e = i - 1; e >= 1; --e) {v[e][n + 1] -= v[e][i] * v[i][n + 1];v[e][i] = 0;}}
}double _edge[N * N], _v[N];int main() { //n = input(), m = input();for (int i = 0; i < m; ++i) {int x = input(), y = input();edge[i] = {x, y};++d[x], ++d[y];G[x].push_back(y);G[y].push_back(x);}init_equations();// sc();solve();// sc();for (int i = 1; i < n; ++i) { // 是 < _v[i] = v[i][n + 1] / d[i];dprintf("%.3lf\n",_v[i]);}for (int i = 0; i < m; ++i) {_edge[i] = _v[edge[i].x] + _v[edge[i].y];}sort(_edge, _edge + m, greater<double>());double ans = 0;for (int i = 0; i < m; ++i) {ans += _edge[i] * (i + 1);dprintf("%.3lf\n",_edge[i]);}printf("%.3lf",ans);return 0;
}
http://www.xdnf.cn/news/17605.html

相关文章:

  • redis 全局命令、数据结构和内部编码、单线程架构
  • 深入理解C语言一维数组的本质:数组名、指针常量与访问细节
  • 250810-OpenWebUI集成Dify应用
  • uboot使用指南
  • 分布微服务电商订单系统Rust编码开发[下]
  • MySQL的逻辑架构和SQL执行的流程:
  • Stream流应用
  • MPLS特性之PHP(Penultimate Hop Popping)
  • afsim2.9_使用QtCreator和VSCode编译
  • 【杂谈】-智能代理+可观察性:构建下一代复杂系统监控体系
  • 《解锁 C++ 起源与核心:命名空间用法 + 版本演进全知道》
  • AUTOSAR进阶图解==>AUTOSAR_ASWS_TransformerGeneral
  • 关于linux操作系统下的文件操作方法:
  • ThinkPHP8学习篇(二):路由
  • 20250810 | 深度学习入门笔记1
  • 从色彩心理学看嵌入式设备UI设计:原则、挑战与实践
  • C语言-动态内存分配函数、变量属性(全局、局部、静态、只读)、C语言内存结构;
  • go加速配置(下载第三方库)
  • [0CTF 2016]piapiapia
  • 【秋招笔试】2025.08.09美团秋招研发岗机考真题-第二题
  • 在Mac上搭建本地AI工作流:Dify与DeepSeek的完美结合
  • 【2025CVPR-图象分类方向】ProAPO:视觉分类的渐进式自动提示优化
  • 【MySQL——第三章 :MySQL库表操作】
  • STM32 DMAMUX 平台驱动程序注册
  • 机器学习——DBSCAN 聚类算法 + 标准化
  • 解读 GPT-5:从“博士级 AI 专家”能力到 OpenAI API Key 获取与实践(提示工程→性能调优全流程)
  • 【递归、搜索与回溯算法】深度优先搜索
  • Spring AOP 底层实现(面试重点难点)
  • 结构化记忆、知识图谱与动态遗忘机制在医疗AI中的应用探析(上)
  • scikit-learn/sklearn学习|线性回归解读