标签:bool 返回 现在 math detail The 数据初始化 个数 两种
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ll long long
using namespace std;
inline int read(){
int x=0,o=1;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')o=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*o;
}
const int N=1005;
int bj[N],size[N],su[N],fail[N];
vector<int>q[N];
inline bool cmp(int x,int y){
return (fail[x]+2)*size[y]<(fail[y]+2)*size[x];
}
inline void dfs(int u){
if(!q[u].size()){//如果是叶子节点
size[u]=1;
su[u]=0;fail[u]=0;
return;
}
for(int i=0;i<q[u].size();++i){//遍历子节点
int v=q[u][i];
dfs(v);size[u]+=size[v];
}
sort(q[u].begin(),q[u].end(),cmp);//按照上面分析的那样排序
for(int i=0;i<q[u].size();++i){
int v=q[u][i];
su[u]+=(fail[u]+1)*size[v]+su[v];
fail[u]+=fail[v]+2;
}
if(bj[u])fail[u]=0;
//别忘了!!!如果有毛毛虫,就不会出现 走进去 又没找到壳 的情况
}
int main(){
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
while(1){
int n=read();if(!n)break;
for(int i=1;i<=n;++i){
bj[i]=0;size[i]=0;
su[i]=0;fail[i]=0;
q[i].clear();
}//多组数据初始化
int x=read();char ch;cin>>ch;//第一组没用
for(int i=2;i<=n;++i){
x=read();cin>>ch;
if(ch=='Y')bj[i]=1;//如果有毛毛虫,打个标记
q[x].push_back(i);//直接vector存图
}
dfs(1);printf("%.4f\n",1.0*su[1]/size[1]);
}
return 0;
}
标签:bool 返回 现在 math detail The 数据初始化 个数 两种
原文地址:https://www.cnblogs.com/PPXppx/p/11437289.html