【BZOJ】【P1415】【Noi2005】【聪聪和可可】【题解】【期望DP】

来源:互联网 发布:c语言if和else if 编辑:程序博客网 时间:2024/05/06 19:37

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1415


Code:

#include<bits/stdc++.h>using namespace std;const int maxn=1005;int n,m,s,t;vector<int>G[maxn];double f[maxn][maxn];int next[maxn][maxn],pre[maxn][maxn];void bfs(int s){for(int i=1;i<=n;i++)f[s][i]=-1;static int vis[maxn];memset(vis,0,sizeof vis);queue<int>q;q.push(s);vis[s]=1;while(!q.empty()){int u=q.front();q.pop();for(int i=0,v;i<G[u].size();i++){if(vis[v=G[u][i]])continue;vis[v]=1;q.push(v);next[s][v]=next[s][u]?next[s][u]:v;}}}double dfs(int i,int j){if(f[i][j]!=-1)return f[i][j];if(i==j)return f[i][j]=0;if(next[i][j]==j||next[next[i][j]][j]==j)return f[i][j]=1;f[i][j]=dfs(next[next[i][j]][j],j);for(int k=0,v;k<G[j].size();k++)f[i][j]+=dfs(next[next[i][j]][j],G[j][k]);f[i][j]/=G[j].size()+1;return ++f[i][j];}int main(){scanf("%d%d",&n,&m);scanf("%d%d",&s,&t);for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);G[u].push_back(v);G[v].push_back(u);}for(int i=1;i<=n;i++)sort(G[i].begin(),G[i].end());for(int i=1;i<=n;i++)bfs(i);printf("%.3lf\n",dfs(s,t));return 0;}


0 0