题意:
解法:
假设有c[i]个点可以到达点i,
那么一次操作中,点i被删除的概率为1/c[i],
那么点i会被删除的期望次数为1/c[i],
对答案的贡献也是1/c[i],
因此最后ans=sum(1/c[i]),其中1<=i<=n,
只需要预处理出c[i]就能算了.
code:
#include <bits/stdc++.h>
using namespace std;
const int maxm=2e6+5;
char s[105][105];
int g[105][105];
int n;
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>(s[i]+1);
for(int j=1;j<=n;j++){
g[i][j]=(s[i][j]=='1');
}
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(g[i][k]&&g[k][j]){
g[i][j]=1;
}
}
}
}
double ans=0;
for(int i=1;i<=n;i++){
int cnt=1;
for(int j=1;j<=n;j++){
if(j==i)continue;
if(g[j][i]){
cnt++;
}
}
ans+=1.0/cnt;
}
printf("%.9f\n",ans);
return 0;
}