期望。。

选每一个节点的代价是1,删除它对答案的贡献是1/deep[Ai](只有当它的祖先都没被删除时,删它才起作用)

input给的是边,无向边vector模拟邻接表存储,再用有向边写一遍

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,deep[N];
double ans;
vector<int>v[N];
void dfs(int fa,int u){
	deep[u]=deep[fa]+1;
	ans+=1/(double)deep[u];
	for(int i=0;i<v[u].size();++i){
		int to=v[u][i];
		if(to==fa) continue;
		dfs(u,to);
	}
}

int main(){
	int x,y;
	while(scanf("%d",&n)!=EOF){
		ans=0;
		for(int i=1;i<=n;++i) v[i].clear();
		for(int i=1;i<n;++i){
			scanf("%d%d",&x,&y);
			v[x].push_back(y);
			v[y].push_back(x);
		}
		dfs(0,1);
		printf("%.10f\n",ans);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42104573/article/details/94599330