hdu 5001 Walk 2014鞍山网络赛E 矩阵快速幂
2014-09-13 19:47
489 查看
题目链接:hdu 5001
给定一张无向的连通图,一共有n个点,m条边,随机从任意一点开始走,在任意一个点走向相连的点的概率都是相同的,一共走d步,分别求出每个点不在这个路径中的概率。
首先可以依据题目条件求出整张图的转移矩阵。然后对于每一个求值的点,将矩阵中以该点为起点的值的置0,然后利用矩阵快速幂,求出走了d步之后在其他的点的概率之和,即该点不在路径中的概率。
比赛的时候想复杂了,一直在想着求第x步第一次走到i点的概率和,用倍增矩阵然后T了 T_T
给定一张无向的连通图,一共有n个点,m条边,随机从任意一点开始走,在任意一个点走向相连的点的概率都是相同的,一共走d步,分别求出每个点不在这个路径中的概率。
首先可以依据题目条件求出整张图的转移矩阵。然后对于每一个求值的点,将矩阵中以该点为起点的值的置0,然后利用矩阵快速幂,求出走了d步之后在其他的点的概率之和,即该点不在路径中的概率。
比赛的时候想复杂了,一直在想着求第x步第一次走到i点的概率和,用倍增矩阵然后T了 T_T
/****************************************************** * File Name: 5001.cpp * Author: kojimai * Creater Time:2014年09月13日 星期六 19时10分21秒 ******************************************************/ #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<iostream> using namespace std; #define FFF 55 bool vis[FFF][FFF]; int cnt[FFF],n; struct node { double num[FFF][FFF]; }val; node mul(node a,node b) { node ret; for(int i = 1;i <= n;i++) { for(int j = 1;j <= n;j++) { ret.num[i][j]=0; for(int k = 1;k <= n;k++) ret.num[i][j]+=a.num[i][k]*b.num[k][j]; } } return ret; } void solve(int n,int d,int x)//求不经过x点的概率 { node now,tmp = val; memset(now.num,0,sizeof(now.num)); for(int i = 1;i <= n;i++) now.num[i][i]=1; for(int i = 1;i <= n;i++) tmp.num[i][x]=0;//对于所求点,将以该点为起点的值置0 //矩阵a次幂的结果num[i][j]表示以j为起点,走a步走到i点概率 while(d) { if(d%2 == 1) now = mul(now,tmp); tmp = mul(tmp,tmp); d/=2; } double ans=0; for(int i=1;i<=n;i++) { if(i==x) continue; for(int j=1;j <= n;j++) { if(j==x) continue; ans+=now.num[i][j];//以j点为起点,不经过x点的情况下,走了d步最终走到i点的概率,求和即为所求点 } } printf("%.10f\n",ans/n);//矩阵快速幂求的结果默认每个起点的概率为1,实际为1/n,因此最终结果要除以n } int main() { int keng; scanf("%d",&keng); while(keng--) { int m,d,x,y; scanf("%d%d%d",&n,&m,&d); memset(vis,false,sizeof(vis)); memset(cnt,0,sizeof(cnt)); for(int i = 0;i < m;i++) { scanf("%d%d",&x,&y); vis[x][y]=vis[y][x]=true; cnt[x]++;cnt[y]++; } memset(val.num,0,sizeof(val.num)); for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { if(vis[i][j]) { val.num[i][j]=1.0/cnt[j];//从j点走到i点的概率 val.num[j][i]=1.0/cnt[i];//从i点走到j点的概率 } } } for(int i=1;i<=n;i++) { solve(n,d,i); } } return 0; }
相关文章推荐
- HDU -- 5001 Walk(2014鞍山网络赛E)(概率)
- 【概率dp,难度3颗星】hdu-5001(2014鞍山网络赛)
- 【HDU 5001】Walk(矩阵快速幂+概率DP)
- hdu 5001 Walk(概率dp+搜索,矩阵快速幂)
- 2014鞍山网络赛 E题||hdu 5001 概率dp
- hdu 5015 233 Matrix 2014 ACM/ICPC Asia Regional Xi'an Online 矩阵快速幂
- 2015沈阳网络赛 1002(HDU 5451 矩阵快速幂 + 矩阵循环群)
- hdu 5001 矩阵 快速幂
- hdu 4291 2012成都赛区网络赛 矩阵快速幂 ***
- 2014鞍山ACM网络赛 HDU5001 Walk
- HDU_4965 Fast Matrix Calculation 2014多校9 矩阵快速幂+机智的矩阵结合律
- HDU 5001 Walk(鞍山网络赛E题)
- hdu 5015 233 Matrix 矩阵快速幂 2014 ACM/ICPC Asia Regional Xi'an Online
- 2014 鞍山网络赛 hdu 5003 Osu!
- LCT link-cut tree Hdu 5002 Tree 2014鞍山网络赛
- HDU 5001 Walk 概率DP BFS 矩阵递推 暴力
- HDU 5015 矩阵优化 (2014西安网络赛)
- hdu 5001 Walk 概率dp 2014 ACM/ICPC Asia Regional Anshan Online
- 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6155 Subsequence Count 矩阵快速幂
- HDU 5001 Walk (2014年鞍山赛区网络赛E题)