您的位置:首页 > 其它

HDU 5001 Walk / 2014 ACM/ICPC Asia Regional Anshan Online

2014-09-14 00:32 423 查看
题目:
LINK

一共n个点,一个人从每个点出发的概率是1/n,到达邻接点的概率相同,求走d步都不会到达ai点的概率i = [1,n]

暴力枚举每一个点ai, 求的是d步内都不会经过ai,dp[i][j] , 表示走第i步,走到j的概率的值,为了体现不经过ai点,进行dp过程时,不用和ai点相连的边进行状态转移。

ans = sum(dp[d][j]) ( j != ai) 

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
#include <queue>
#include <map>
#include <set>
using namespace std;
#define INF 1000000000
//typedef __int64 LL;
#define N 10005
int t, n, d, m;
double dp
[52];
vector<int > save[55];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif // ONLINE_JUDGE
scanf("%d", &t);
while(t--) {
scanf("%d%d%d", &n, &m, &d);
for(int i = 0; i <= n; i++) save[i].clear();
int u, v;
for(int i = 1; i <= m; i++) {
scanf("%d%d", &u, &v);
save[u].push_back(v);
save[v].push_back(u);
}
for(int i = 1; i <= n; i++) {
memset(dp, 0, sizeof(dp));
for(int j = 1; j <= n; j++) dp[0][j] = 1.0 / n;

for(int id = 1; id <= d; id ++) {
for(int j = 1; j <= n; j++) {
if(j == i) continue;
int ddd = save[j].size();
for(int kk = 0; kk < ddd; kk++) {
int k = save[j][kk];
dp[id][k] += 1.0 * dp[id - 1][j] / ddd ;
}
}
}
double ans = 0;
for(int j = 1; j <= n; j++) {
if(j == i) continue;
ans += dp[d][j];
}
printf("%lf\n", ans);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: