0828-T4 聪聪与可可
0828-T4 聪聪与可可
题意
猫抓老鼠。
猫每次会走到四周距离老鼠最近的点。若没抓到老鼠还会再走一次。
老鼠每次会等概率向四周走一步,求猫抓到老鼠的期望时间。
思路
与处理出
若
若猫一步吃到老鼠,
使用记忆化搜索实现。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
int n, m, nxt[N][N], d[N][N];
vector <int> e[N];
double f[N][N];
void bfs(int s) {
queue <int> q;
q.push(s);
while (!q.empty()) {
int p = q.front(); q.pop();
for (auto v : e[p]) {
if (d[s][v] || v == s) continue;
d[s][v] = d[s][p] + 1;
q.push(v);
}
}
}
double dfs(int cat, int mouse) {
if (cat == mouse) return f[cat][mouse] = 0;
int nxtcat = nxt[cat][mouse];
if (nxtcat == mouse) return f[cat][mouse] = 1;
nxtcat = nxt[nxtcat][mouse];
if (nxtcat == mouse) return f[cat][mouse] = 1;
if (f[cat][mouse]) return f[cat][mouse];
double res = 1, P = e[mouse].size() + 1;
res += dfs(nxtcat, mouse) / P;
for (auto nxtmouse : e[mouse])
res += dfs(nxtcat, nxtmouse) / P;
return f[cat][mouse] = res;
}
int main() {
cin >> n >> m;
int C, M; cin >> C >> M;
for (int i = 1, u, v; i <= m; i ++) {
cin >> u >> v;
e[u].push_back(v);
e[v].push_back(u);
}
for (int i = 1; i <= n; i ++) bfs(i);
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= n; j ++) {
d[0][j] = 1e9; int& p = nxt[i][j];
for (auto v : e[i]) {
if (d[v][j] < d[p][j]) p = v;
if (d[v][j] == d[p][j] && v < p) p = v;
}
}
}
dfs(C, M);
cout << fixed << setprecision(3) << f[C][M] << "\n";
return 0;
}
本文来自博客园,作者:maniubi,转载请注明原文链接:https://www.cnblogs.com/maniubi/p/18386477,orz
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具