首页 > 代码库 > HDU 5001 Walk(鞍山网络赛E题)
HDU 5001 Walk(鞍山网络赛E题)
HDU 5001 Walk
题目链接
思路:枚举每个要经过的点,然后进行状态转移,状态为dp[i][j],状态表示当前在j的点,已经走了i步,每次转移的时候,不从这个枚举的点出发,这样就可以求出所有路径经过该点的概率p, 然后1 - p就是不经过的答案
代码:
#include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int N = 55; const int M = 10005; int t, n, m, d; double dp[N][M]; vector<int> g[N]; double solve(int u) { double ans = 0; memset(dp, 0, sizeof(dp)); dp[0][0] = 1; for (int i = 0; i <= d; i++) { for (int j = 0; j <= n; j++) { if (u == j) continue; double p = 1.0 / g[j].size(); for (int k = 0; k < g[j].size(); k++) { dp[g[j][k]][i + 1] += dp[j][i] * p; } } ans += dp[u][i + 1]; } return 1.0 - ans; } int main() { scanf("%d", &t); while (t--) { scanf("%d%d%d", &n, &m, &d); for (int i = 0; i <= n; i++) g[i].clear(); int u, v; while (m--) { scanf("%d%d", &u, &v); g[u].push_back(v); g[v].push_back(u); } for (int i = 1; i <= n; i++) g[0].push_back(i); for (int i = 1; i <= n; i++) printf("%.10lf\n", solve(i)); } return 0; }
HDU 5001 Walk(鞍山网络赛E题)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。