设为首页 加入收藏

TOP

HDU 5001 Walk 求从任意点出发任意走不经过某个点的概率 概率dp 2014 ACM/ICPC Asia Regional Anshan Online
2015-07-20 17:41:48 来源: 作者: 【 】 浏览:4
Tags:HDU 5001 Walk 任意 出发 经过 某个 概率 2014 ACM/ICPC Asia Regional Anshan Online

题意:

给定n个点m条边的无向图

问:

从任意点出发任意走d步,从不经过某个点的概率

dp[i][j]表示从不经过i点的前提下,走了d步到达j点的概率。


#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          using namespace std; #define N 55 #define eps (1e-8) struct Edge{ int from, to, nex; }edge[N*N*N]; int head[N], edgenum; void init(){memset(head, -1, sizeof head); edgenum = 0;} void add(int u, int v){ Edge E = {u,v,head[u]}; edge[edgenum] = E; head[u] = edgenum++; } double dp[2][N][N], siz[N]; int n, m, d; void solve(){ scanf("%d %d %d", &n, &m, &d); init(); int u, v; for(int i = 1; i <= n; i++)siz[i] = 0.0; while(m--){ scanf("%d %d",&u,&v); add(u,v); add(v,u); siz[u] += 1.0; siz[v] += 1.0; } int cur = 0; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) if(i == j) dp[cur][i][j] = 0; else dp[cur][i][j] = 1.0/(double)n; while(d--) { cur ^= 1; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) dp[cur][i][j] = 0; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) if(i!=j) { double Size = siz[j]; if(Size < eps)continue; for(int k = head[j]; ~k; k = edge[k].nex) if(edge[k].to != i) { dp[cur][i][edge[k].to] += dp[cur^1][i][j] / Size; } } } for(int i = 1; i <= n; i++) { double ans = 0; for(int j = 1; j <= n; j++) ans += dp[cur][i][j]; printf("%.10f\n", ans); } } int main(){ int T;scanf("%d",&T); while(T--){ solve(); } return 0; } /* 3 3 2 1 2 2 3 3 1 */
        
       
      
     
    
   
  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇a++和++a左值问题 下一篇HDU-5001 Walk 2014年鞍山网络赛E..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·MySQL 安装及连接-腾 (2025-12-25 06:20:28)
·MySQL的下载、安装、 (2025-12-25 06:20:26)
·MySQL 中文网:探索 (2025-12-25 06:20:23)
·Shell脚本:Linux Sh (2025-12-25 05:50:11)
·VMware虚拟机安装Lin (2025-12-25 05:50:08)