zoukankan      html  css  js  c++  java
  • 【dfs】codeforces Journey

    http://codeforces.com/contest/839/problem/C

    【AC】

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cmath>
    
    using namespace std;
    const int maxn=2e5+3;
    struct edge
    {
        int to;
        int nxt; 
    }e[maxn];
    int head[maxn];
    int tot;
    int dep[maxn];
    double ans;
    int n;
    void init()
    {
        memset(head,-1,sizeof(head));
        tot=0;
    }
    void add(int u,int v)
    {
        e[tot].to=v;
        e[tot].nxt=head[u];
        head[u]=tot++;
    }
    
    void dfs(int u,int pa,double p)
    {
    //    cout<<u<<" "<<p<<" "<<dep[u]<<endl;
        int cnt=0;
        for(int i=head[u];i!=-1;i=e[i].nxt)
        {
            int v=e[i].to;
            if(v==pa) continue;
            cnt++;
        }
        for(int i=head[u];i!=-1;i=e[i].nxt)
        {
            int v=e[i].to;
            if(v==pa) continue;
            dep[v]=dep[u]+1;
            dfs(v,u,p/(double)cnt);
        }
        if(cnt==0)
        {
    //        cout<<"叶节点"<<u<<endl;
            ans+=(double)dep[u]*p;
        }
        
    }
    int main()
    {
        while(~scanf("%d",&n))
        {
            init();
            memset(dep,0,sizeof(dep));
            int u,v;
            for(int i=0;i<n-1;i++)
            {
                scanf("%d%d",&u,&v);
                add(u,v);
                add(v,u);
            }
            ans=0.0;
            dep[1]=0;
            dfs(1,0,1);
            printf("%.15f
    ",ans);
        }
        return 0;    
    }

    【注意】

    不能先把所有的分枝数乘起来得到cnt,最后到叶节点再计算概率1/cnt,这样cnt会爆的,一开始就是因为这个WA了

  • 相关阅读:
    在eclipse 中添加 Tomcat
    eclipse启动报错:code13
    基础_cup给出的内存地址
    巫师3_战斗_水中水鬼
    git checkout
    git学习
    Linux软件包管理之yum在线管理
    Vagrant入门1
    mvn java项目README.md文件范例
    深入理解yum工作原理
  • 原文地址:https://www.cnblogs.com/itcsl/p/7355315.html
Copyright © 2011-2022 走看看