思路:设sum[i],le[i],back[i],worm[i]分别表示以i为根节点需要的完成步数,叶子节点数,失败回退步数,以及i是否有虫。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define Maxn 1010
using namespace std;
int sum[Maxn],worm[Maxn],le[Maxn],vi[Maxn],head[Maxn],e,n,back[Maxn];
struct Edge{
int u,v,next;
}edge[Maxn*Maxn];
void init()
{
memset(sum,,sizeof(sum));
memset(worm,,sizeof(worm));
memset(le,,sizeof(le));
memset(vi,,sizeof(vi));
memset(back,,sizeof(back));
memset(head,-,sizeof(head));
e=;
}
void add(int u,int v)
{
edge[e].u=u,edge[e].v=v,edge[e].next=head[u],head[u]=e++;
}
int cmp(int a,int b)
{
return (back[a]+)*le[b]<(back[b]+)*le[a];
}
void dfs(int u)
{
int i,v,cnt;
int use[];
cnt=;
if(head[u]==-)
{
le[u]=;
return ;
}
for(i=head[u];i!=-;i=edge[i].next)
{
v=edge[i].v;
dfs(v);
use[++cnt]=v;
le[u]+=le[v];
}
sort(use+,use++cnt,cmp);
for(i=;i<=cnt;i++)
{
sum[u]+=(back[u]+)*le[use[i]]+sum[use[i]];
back[u]+=back[use[i]]+;
}
if(worm[u])
back[u]=;
}
int main()
{
int i,j,a;
char str[];
while(scanf("%d",&n),n)
{
init();
scanf("%d%s",&a,&str);
if(str[]=='Y')
worm[]=;
for(i=;i<=n;i++)
{
scanf("%d%s",&a,&str);
add(a,i);
if(str[]=='Y')
worm[i]=;
}
dfs();
double temp=sum[];
printf("%.4lf\n",sum[]/(1.0*le[]));
}
return ;
}

最新文章

  1. ASP.NET MVC 5 - 控制器
  2. Learn ZYNQ (9)
  3. 封装tip控件
  4. angular学习的一些小笔记(中)之ng-init
  5. android之ViewPager的使用
  6. Java Hour 46 SLF4J
  7. hdu 2897 邂逅明下
  8. python源码解析
  9. 关于C# Winform 程序开机自动启动
  10. Eclipse 快捷键操作和常用设置
  11. FZU2126:消除类游戏(DP)
  12. CruiseControl.Net全面实现持续集成
  13. iOS真机调试配置
  14. 阿里微服务架构下分布式事务解决方案-GTS
  15. LeetCode.atoi
  16. 什么是shell和终端?
  17. Java学习笔记——i++与++i问题
  18. MySQL索引扩展(Index Extensions)学习总结
  19. python 将字节字符串转换成十六进制字符串
  20. 20170912xlVBA批量导入txt文件

热门文章

  1. 2016 CocosPods安装教程
  2. nyoj 127 星际之门(一)
  3. 在Linux下部署activemq
  4. 【Java】IO流简单分辨
  5. 学习LINQ,发现一个好的工具。LINQPad!!
  6. SQL创建linkserver
  7. 十,选择cfee编辑器并学会调试程序。以及结束语。
  8. 如何知道PostgreSQL数据库下每个数据库所对应的目录
  9. C#窗体间通讯的几种处理方法
  10. 实现经常使用的配置文件/初始化文件读取的一个C程序