agc049a 题解

agc049a

思路

期望。

CF280C 相似的思路。

每个点最多被做一次,或者被其他点影响。设 fif_i 表示 ii 是否被选,为 0011。答案为 E[fi]E[\sum f_i],即 fi\sum f_i 的期望。

ans=E[fi]=E[fi]=pians=E[\sum f_i]=\sum E[f_i]=\sum p_i

所以答案为每个点被选的概率的和。

能影响点 ii 使其不被选的点,是那些能到达 ii 的点,如果在 ii 之前被选,那么 ii 就不用选了。所以设 sizsiz 为能影响点 ii 的点数(包括自己),则 pi=1sizp_i=\frac{1}{siz}

n100n\leq100 ,用 弗洛伊德 看一个点能去哪些点。

code

double n,ans,siz;
char c[maxn];
int e[maxn][maxn];
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>c+1;
		for(int j=1;j<=n;j++)e[j][i]=c[j]-'0';
	}
	for(int i=1;i<=n;i++)e[i][i]=1;
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(e[i][k]&&e[k][j])e[i][j]=1;
			}
		}
	}
	for(int i=1;i<=n;i++){
		siz=0;
		for(int j=1;j<=n;j++){
			if(e[i][j])++siz;
		}
		ans+=1.0/siz;
	}
	printf("%.10lf",ans);
}