4726: [POI2017]Sabota?
Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 659 Solved: 281
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1
1
2
2
2
3
7
3
Sample Output
HINT
Source
#include <bits/stdc++.h>
using namespace std;
int n, k, last[500005], cnt, siz[500005]; double dp[500005], ans = 0;
struct Edge{ int to, next; }e[1000005];
void insert( int u, int v ){ e[++cnt].to = v; e[cnt].next = last[u]; last[u] = cnt; }
void dfs( int x ){
siz[x] = 1;
if( !last[x] ) dp[x] = 1.0;
for( int i = last[x]; i; i = e[i].next ){
dfs( e[i].to );
siz[x] += siz[e[i].to];
}
for( int i = last[x]; i; i = e[i].next )
dp[x] = max( dp[x], min( dp[e[i].to], (double)siz[e[i].to]/(siz[x]-1) ) );
if( siz[x] > k ) ans = max( ans, dp[x] );
}
int main(){
scanf( "%d%d", &n, &k );
for( int i = 1, p; i < n; i++ ) scanf( "%d", &p ), insert( p, i + 1 );
dfs( 1 );
printf( "%.10lf\n", ans );
return 0;
}