Codeforcesラウンド#428(ディビジョン2。)、問題:(C)ジャーニー【DFS +期望】

問題の意味

あなたのルートノード1、ノードからそれぞれ出発し、1の各辺の長さをルートノードを、他の確率がそのサブツリーを取る木(問題、および無向グラフの非環式を読み取ることに注意)を得ました、葉が終了し、同じノード内の状態を介して所望の経路長を通して求め、もはや徒歩ではありません。

思考

ノードは、再びライン上でその父ノードなしで唯一の非環式を検討する必要性のために通過した後、ディープ・サブツリー長を検索し、その上の各ノードのサブツリーの数を記録することはできません。

コード

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int maxn=100000+10;
int n;
vector<int> G[maxn];
double dfs(int u,int root){
    double res=0.0;
    int cc=0;
    for(int i=0;i<G[u].size();i++)
        if(G[u][i]!=root) cc++;
    if(cc==0) return 0.0;
    for(int i=0;i<G[u].size();i++){
        int v=G[u][i];
        if(v==root) continue;
        res+=dfs(v,u)+1.0;//每次走一步,长度加1
    }
    return res/cc;//返回期望路径长度
}
int main(){
    cin>>n;
    for(int i=0;i<n-1;i++){
        int u,v;
        cin>>u>>v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
    double res=dfs(1,-1);
    printf("%.15f\n",res);
    return 0;
}
学如逆水行舟,不进则退
公開された409元の記事 ウォンの賞賛956 ビュー120 000 +

おすすめ

転載: blog.csdn.net/weixin_42429718/article/details/104098959