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