Example
Input
4
1 2
1 3
2 4
Output
1.500000000000000
Input
5
1 2
1 3
3 4
2 5
Output
2.000000000000000
题意:输入点的个数N,然后输入N-1条边(无向),判断叶子的期望。
期望=概率*路径
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct table{
int e,next;
}ed[200010];
struct Point{
int num;//他的孩子
int next;
int level;//层数
double we;
}point[200010];
int visit[100009]={0};
queue<int>q;
int main()
{
int N;
while(~scanf("%d",&N)){
double sum=0;int cnt=0;
for(int i=0;i<100001;i++){
visit[i]=0;
ed[i].next=-1;
if(i==1)//除了根节点外,每个结点都要减去双亲的那一条临边
point[i].num=0;
else point[i].num=-1;
point[i].level=0;
point[i].next=-1;//相当于动态邻接表中的next指针为空
}
int x,y;
int n=N;
for(int i=0;i<N-1;++i){
cin>>x>>y;
//无向图的邻接表建立:
ed[cnt].e=y;ed[cnt].next=-1;
ed[cnt].next=point[x].next;
//mymap[point[mymap[i].s].next].next=-1;
point[x].next=cnt;//头插法
point[x].num++;
cnt++;
ed[cnt].e=x;ed[cnt].next=-1;
ed[cnt].next=point[y].next;
//mymap[point[mymap[i].s].next].next=-1;
point[y].next=cnt;//头插法
point[y].num++;
cnt++;
}
q.push(1);visit[1]=1;point[1].level=1;point[1].we=1;
while(!q.empty()){//静态邻接表的层次遍历
int m=q.front();q.pop();//cout<<m<<endl;
int c=0;
for(int i=point[m].next;i!=-1;i=ed[i].next)
if(!visit[ed[i].e])
c++;//c记录没有访问过的临边的数量
for(int i=point[m].next;i!=-1;i=ed[i].next)
{
int t=ed[i].e;
if(!visit[t])
{
q.push(t);
visit[t]=1;
point[t].level=point[m].level+1;
point[t].we=point[m].we/c;
}
}
if(c==0)
sum+=(double)(point[m].level-1)*point[m].we;
}
//double z=(double)sum/(double)num;
printf("%lf\n",sum);
}
return 0;
}