Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
我也会树形dp了#include <cstdio> #include <iostream> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int MAX = 1111; int N; vector<int> G[MAX]; char c[MAX]; int dp[MAX];//表示当壳在该子树下面时,遍历完所需要步骤数 int leaf[MAX];//表示某节点下有多少叶子 int fail[MAX];//表示壳不在子树下面,遍历完再回来需要步骤数 bool cmp(int a,int b) { return (2+fail[a])*leaf[b] < (2+fail[b])*leaf[a]; } void dfs(int u) { int flag = 0; for(int i = 0;i < G[u].size();++i) { int v = G[u][i]; dfs(v); flag = 1; leaf[u] += leaf[v]; } sort(G[u].begin(),G[u].end(),cmp); if(!flag) leaf[u] = 1; for(int i = 0;i < G[u].size();++i) { int v = G[u][i]; dp[u] += fail[u]*leaf[v] + dp[v] + leaf[v]; fail[u] += fail[v] + 2; } if(c[u] == 'Y') fail[u] = 0; } int main() { while(~scanf("%d",&N)&&N) { memset(dp,0,sizeof(dp)); memset(leaf,0,sizeof(leaf)); memset(fail,0,sizeof(fail)); for(int i = 1;i <= N;i++) G[i].clear(); for(int i = 1;i <= N;i++) { int fa; scanf("%d %c",&fa,&c[i]); if(fa == -1) continue; G[fa].push_back(i); } dfs(1); printf("%.4f\n",double(dp[1])/double(leaf[1])); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator