https://atcoder.jp/contests/agc049/tasks/agc049_a
概率期望构造一生之敌
对于每个点的贡献,就是所有能到达他的点都不能在他之前选,他就能贡献1
那么每个点能+1的贡献就是(1/所有能到他的点数)
其实我现在还不是很能理解这个东西的正确性,hwh总是告诉我期望有很良好自然的性质我总想不明白,我对期望的理解还停留在所有方案的总和除以方案总数,所以只能做威海C那种题,再期望一点的题过得了也想不明白
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=110;
int n,m,cnt,tot,cas;double ans;
int a[maxl][maxl],b[maxl][maxl];
bool vis[maxl];
char s[maxl];
inline void prework()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);
for(int j=1;j<=n;j++)
a[i][j]=s[j]-'0',b[j][i]=a[i][j];
}
}
inline void dfs(int u)
{
++tot;vis[u]=true;
for(int i=1;i<=n;i++)
if(b[u][i] && !vis[i])
dfs(i);
}
inline void mainwork()
{
ans=0;
for(int i=1;i<=n;i++)
{
tot=0;
for(int j=1;j<=n;j++)
vis[j]=false;
dfs(i);
ans+=1.0/tot;
}
}
inline void print()
{
printf("%.10f\n",ans);
}
int main()
{
int t=1;
//scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}