[[http://poj.org/problem?id=2057|POJ 2057]] //不太聪明的版本// #include #include #include #include #include #include #define INF 0x3f3f3f3f using namespace std; int n,f[1005],sz[1005],head[1005],mxlen[1005],cnt; bool worm[1005]; struct Node{int nxt,to;}Edges[1005*2]; void addedge(int u,int v) { Edges[++cnt].nxt=head[u]; head[u]=cnt,Edges[cnt].to=v; } int dfs(int u) { if(head[u]==-1){sz[u]=1;return f[u];} if(f[u])return f[u]; int son[8],top=0,p[8]={0,1,2,3,4,5,6,7}; for(int i=head[u];~i;i=Edges[i].nxt) { int v=Edges[i].to; dfs(v); sz[u]+=sz[v],son[top++]=v; } f[u]=INF; do { int len=0,res=0; for(int i=0;i0)addedge(f,i); } printf("%.4lf\n",1.0*dfs(1)/sz[1]); } return 0; } //贪心// #include #include #include #include #include #include #define INF 0x3f3f3f3f using namespace std; int n,f[1005],sz[1005],head[1005],mxlen[1005],cnt; bool worm[1005]; struct Node{int nxt,to;}Edges[1005*2]; void addedge(int u,int v) { Edges[++cnt].nxt=head[u]; head[u]=cnt,Edges[cnt].to=v; } bool cmp(int x,int y){return (mxlen[x]+2)*sz[y]<(mxlen[y]+2)*sz[x];} int dfs(int u) { if(head[u]==-1){sz[u]=1;return f[u];} if(f[u])return f[u]; int son[8],top=0; for(int i=head[u];~i;i=Edges[i].nxt) { int v=Edges[i].to; dfs(v); sz[u]+=sz[v],son[top++]=v; mxlen[u]+=mxlen[v]+2; } if(worm[u])mxlen[u]=0; f[u]=0; sort(son,son+top,cmp); for(int i=0;i0)addedge(f,i); } printf("%.4lf\n",1.0*dfs(1)/sz[1]); } return 0; }