나무에 Codeforces의 A. 게임 (期望 DFS)

주제 설명 :

나무에 게임

테스트 당 시간 제한

1 초

시험 당 메모리 제한

256메가바이트

입력

표준 입력

산출

표준 출력

모미지는 구성, 뿌리 트리를 가지고 n 개의 노드. 트리 노드 1에 정수로 번호가 매겨집니다 N . 뿌리는 숫자 1 모미지이 나무에 게임을하기로 결정했다.

이 게임은 여러 단계로 구성되어 있습니다. 각 단계에서 모미지 나머지 트리 노드 중 하나를 (의에 의해 그것을 나타내는하게 선택 V )와 노드의 루트와 모든 하위 트리 노드 제거 V 트리에서합니다. 노드 V는 도 삭제됩니다. 나무가 남아있는 노드가 없을 때 게임은 완료됩니다. 즉, 게임 노드 번호 1을 선택하는 단계 이후에 종료한다.

때마다 모미지는 나머지 모든 노드 사이에서 균일하게 새로운 노드를 선택합니다. 당신의 작업은 설명 게임의 단계 수의 기대를 찾는 것입니다.

입력

첫 번째 줄은 정수가 들어 N (1 ≤  n 개의  ≤의  \ (10 ^ 5 \) 트리의 노드 수를 -). 다음 N  - 1 개 라인은 나무 가장자리가 포함되어 있습니다. I 번째 라인은 정수를 포함 \ (A_I \) , \ (b_i \) (1 ≤  \ (A_I \) ,  \ (b_i \)  ≤  N ; A_I  ≠  b_i ) -에 의해 접속되어있는 노드의 개수 에지 번째.

주어진 그래프는 나무입니다 보장됩니다.

산출

설명 된 게임의 단계 수의 기대 - 하나의 실수를 인쇄합니다.

절대 또는 상대 오차를 초과하지 않는 경우에는 정답 간주한다 \가 (10 ^ {- 6} \) .

입력

21 2

산출

1.50000000000000000000

입력

31 21 3

산출

2.00000000000000000000

노트

첫 번째 샘플에서는 두 가지 경우가 있습니다. 하나는 직접 루트를 제거하고 다른 한 단계 후 루트를 제거합니다. 따라서 예상되는 단계는 다음과 같습니다

1 × (1 / 2) + 2 × (1 / 2) = 1.5

두 번째 샘플에서, 좀더 복잡해진다. 첫 번째 샘플로 감소 이가지 경우, 한 번에 청소 한 경우가 있습니다. 따라서 예상되는 단계는 다음과 같습니다

1 × (1 / 3) + (1 + 1.5) × (2 / 3) = (1 / 3) + (3분의 5) = 2

아이디어 :

, 트리 노드를 삭제 말할 하위 트리 제거해야 다음 노드를 제거, 삭제 작업이 단계의 수는이 프로세스의 종료 후 루트 노드 하나를 제거 할 권리가 다른 작업은 몇 단계 운영에 해당합니다. 질문 단계의 원하는 동작 번호이다.

시작이 어떻게 할까? 그림은 조금 의미 보인다 여러 그림을 발견 후, 나는 즉, 루트 노드를 삭제하고, 작업이, 지금은 완전히 그 단계가 완료 삭제 가정, 시작하는 1 단계에서 삭제하고 있다고 생각합니다. 내가 두 단계 완전 삭제할 필요 마지막 단계는 루트 노드를 삭제 유지하기 위해, 첫 번째 단계는 노드를 삭제합니다. 나는, 삭제, 루트 노드의 마지막 단계를 삭제하는 세 가지 단계를 완료하려면, 두 개의 노드를 삭제하는 방법은 두 가지 단계가 있습니다. 그래서이 계산 공식을 표시하지만 그때, 삭제, 두 개의 노드는 노드 지점이 존재하지 않는 바이트를 삭제 한 경우, 아 정렬, 따라서 삭제할 수 없습니다 문제를 발견했다. 그래서 나는 혼란에 빠졌다.

나중에 순서가 원래의 노드와 삭제 느낌,이 단계의 깊이보다 노드 큰 깊이는 작동하지 않습니다 단계의 수에있는 모든 노드를 삭제하는 것입니다, 그러나 이것은 노드를 삭제할 수 있기 때문에 다른 한편으로, 그의 모든를 나타내는 부모 노드가 삭제되지 않았습니다. 공정 수로 노드 I에 기여하는 단계이고, 상기 확률은 상기 노드를 삭제할 수 \ (\ FRAC {1} {깊이 [I] +1} \) (만큼 상기의 라인을 삭제하지 않은 바와 같이) 마지막 있도록 기대는 \ (\ sum_i \ FRAC. {{1 깊이 [I] +1} \) .

나무의 소스 구현은 이전의 별을 사용하는 체인을 나타냅니다. 당신은 질문이있는 경우에 당신은 블로그 (헤 헤)을 공상 할 수 있습니다.

코드 :

#include <iostream>
#include <iomanip>
using namespace std;
#define max_n 100005
int head[max_n];
struct edge
{
    int to;
    int next;
}e[max_n<<1];
int cnt = 0;
int d[max_n];
int n;
void add(int u,int v)
{
    e[++cnt].to = v;
    e[cnt].next = head[u];
    head[u] = cnt;
}
void dfs(int x,int from)
{
    for(int i = head[x];i;i=e[i].next)
    {
        if(e[i].to==from)
        {
            continue;
        }
        d[e[i].to] = d[x]+1;
        dfs(e[i].to,x);
    }
}
int main()
{
    cin >> n;
    for(int i = 1;i<n;i++)
    {
        int a,b;
        cin >> a >> b;
        add(a,b);
        add(b,a);
    }
    d[1] = 1;
    dfs(1,0);
    double ans = 0;
    for(int i = 1;i<=n;i++)
    {
        //cout << d[i] << endl;
        ans = ans+1.0/d[i];
    }
    cout.setf(ios_base::fixed,ios_base::floatfield);
    cout << setprecision(20) << ans << endl;
    return 0;
}

참고 기사 :

LeTri, Codeforces 280. 나무에 게임, https://www.cnblogs.com/LeTri/p/9157166.html

추천

출처www.cnblogs.com/zhanhonhao/p/11294160.html