生活随笔
收集整理的這篇文章主要介紹了
P6154 游走 概率dp
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
傳送門
題意:
思路: 給你個DAGDAGDAG,由于每一條路徑出現概率相等,那么期望就是總長度路徑個數\frac{總長度}{路徑個數}路徑個數總長度?。設f[i]f[i]f[i]表示到iii這個點的總長度,g[i]g[i]g[i]表示到iii這個點路徑的總個數。那么轉移方程也比較好想了:f[i]=∑edge(j,i)(f[j]+g[j])f[i]=\sum_{edge(j,i)}(f[j]+g[j])f[i]=edge(j,i)∑?(f[j]+g[j]) g[i]=∑edge(j,i)g[j]+1g[i]=\sum_{edge(j,i)}g[j]+1g[i]=edge(j,i)∑?g[j]+1
g[i]g[i]g[i]要加一是因為要加上自己到自己的,最終答案為∑f[i]∑g[i]\frac{\sum f[i]}{\sum g[i]}∑g[i]∑f[i]?。
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std
;
typedef long long LL
;
typedef unsigned long long ULL
;
typedef pair
<int,int> PII
;const int N
=1000010,mod
=998244353,INF
=0x3f3f3f3f;
const double eps
=1e-6;int n
,m
;
int d
[N
];
LL f
[N
],g
[N
];
vector
<int>v
[N
];LL
qmi(LL a
,LL b
)
{LL ans
=1;while(b
){if(b
&1) ans
=ans
*a
%mod
;a
=a
*a
%mod
;b
>>=1;}return ans
;
}void topsort()
{queue
<int>q
;for(int i
=1;i
<=n
;i
++) if(!d
[i
]) q
.push(i
),g
[i
]=1;while(q
.size()){int u
=q
.front(); q
.pop();for(auto x
:v
[u
]){(f
[x
]+=f
[u
]+g
[u
])%=mod
;(g
[x
]+=g
[u
])%=mod
;if(--d
[x
]==0) q
.push(x
),g
[x
]++;}}LL ans1
=0,ans2
=0;for(int i
=1;i
<=n
;i
++) (ans1
+=f
[i
])%=mod
,(ans2
+=g
[i
])%=mod
;printf("%lld\n",ans1
*qmi(ans2
,mod
-2)%mod
);
}int main()
{
scanf("%d%d",&n
,&m
);for(int i
=1;i
<=m
;i
++){int a
,b
; scanf("%d%d",&a
,&b
);v
[a
].pb(b
); d
[b
]++;}topsort();return 0;
}
總結
以上是生活随笔為你收集整理的P6154 游走 概率dp的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。