code:
#include <cstdio>
#include <string>
#include <algorithm>
#define N 500005
#define inf 0.0000000001
using namespace std;
namespace IO {
void setIO(string s)
{
string in=s+".in";
string out=s+".out";
freopen(in.c_str(),"r",stdin);
// freopen(out.c_str(),"w",stdout)
}
};
double f[N];
double ans;
int n,k,edges;
int fa[N],hd[N],to[N],nex[N],size[N];
void add(int u,int v)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
void dfs(int u)
{
f[u]=-1.0;
size[u]=1;
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
dfs(v);
size[u]+=size[v];
}
int mx=0;
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
f[u]=max(f[u],min(f[v],(double)size[v]/(size[u]-1))); // 最大比例
mx=max(mx,size[v]);
}
if(f[u]==-1.0) f[u]=N;
if(size[u]>k) ans=max(ans,f[u]==N?1.0:f[u]);
}
int main()
{
// IO::setIO("input");
int i,j;
scanf("%d%d",&n,&k);
for(i=2;i<=n;++i) scanf("%d",&fa[i]),add(fa[i],i);
ans=0.0;
dfs(1);
if(ans==0.0000000) printf("0\n");
else printf("%.10f\n",ans);
return 0;
}
本文深入探讨了使用C++实现的一种复杂图论算法,详细介绍了如何通过深度优先搜索(DFS)来解决特定的图问题,包括节点遍历、边处理及最大比例计算等关键步骤。文章提供了一个完整的代码示例,涵盖了从输入读取到结果输出的全过程,并对算法的运行流程进行了详尽的注释说明。
1375

被折叠的 条评论
为什么被折叠?



