题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1415
数据生成器:http://paste.ubuntu.com/22417252/
论文题,记忆化深搜
我在处理该去哪时,用的三方的floyd
然而hzwer告诉我,平方的bfs就好QAQ,反正没有T,我就不改啦!(づ ̄ 3 ̄)づ
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAXN = 1000+9; const int INF = 1000000; const double sta = -0.5; int n,m,C,M,d[MAXN][MAXN],to[MAXN][MAXN],cnt[MAXN]; double ans[MAXN][MAXN]; inline int read(){ char c=getchar(); int ret=0; while (c<'0'||c>'9') c=getchar(); while (c<='9'&&c>='0') ret=ret*10+c-'0',c=getchar(); return ret; } inline void Floyd(){ for (int k=1;k<=n;k++) for (int i=1;i<=n;i++) if (d[i][k] < INF) for (int j=1;j<=n;j++) d[i][j] = min(d[i][j], d[i][k] + d[k][j]); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) for (int k=1;k<=n;k++) if (d[i][k] == 1 && d[k][j] == d[i][j]-1) {to[i][j] = k; break;} for (int i=1;i<=n;i++) to[i][i] = i; } double Get_Ans(int u, int v){ if (ans[u][v] > sta) return ans[u][v]; else { if (to[to[u][v]][v] != v) { ans[u][v] = Get_Ans(to[to[u][v]][v],v)+1; for (int i=1;i<=n;i++) if (d[v][i] == 1) ans[u][v] += Get_Ans(to[to[u][v]][v],i)+1; return ans[u][v] /= cnt[v]; } else return ans[u][v] = 1; } } int main(){ n = read(); m = read(); C = read(); M = read(); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) d[i][j] = INF, ans[i][j] = -1; for (int i=1;i<=n;i++) d[i][i] = 0, ans[i][i] = 0, cnt[i] = 1; for (int i=1,a,b;i<=m;i++) cnt[a = read()]++, cnt[b = read()]++, d[a][b] = d[b][a] = 1; Floyd(); printf("%.3lf\n",Get_Ans(C,M)); return 0; }