CodeForces - 839C journey

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Seeyouer/article/details/78662390

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;
}

猜你喜欢

转载自blog.csdn.net/Seeyouer/article/details/78662390