1. 程式人生 > >隨機遊走

隨機遊走

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

#include<bits/stdc++.h>
#define N 110000
#define inf 1e9+7
#define ll long long
using namespace std;
inline int read()
{
    int x=0,flag=1;
    char ch=0;
    while(!isdigit(ch))
 {
  ch=getchar();
  if(ch=='-')
   flag=-1;
 }
    while(isdigit(ch))
 {
  x=(x<<3)+(x<<1)+ch-'0'
; ch=getchar(); } return x*flag; } struct edge { int to; int nxt; double w; }e[N*2]; int num,head[N]; inline void add(int x,int y) { num++; e[num].to=y; e[num].nxt=head[x]; head[x]=num; } int d[N],dep[N]; double ans,f[N],g[N],up[N],down[N]; void dfs(int x,int fa) { f[x]=d[x]; dep[x]=
dep[fa]+1; for(int i=head[x];i;i=e[i].nxt) { int to=e[i].to; if(to==fa) continue; dfs(to,x); f[x]+=f[to]; } if(x==1) f[x]=0; } void solve(int x,int fa) { g[x]+=g[fa]+d[fa]; if(x==1)g[x]=0; double tot=0; for(int i=head[x];i;i=e[i].nxt) { int to=e[i].to; if(to==fa) continue;
tot+=f[to]; } for(int i=head[x];i;i=e[i].nxt) { int to=e[i].to; if(to==fa) continue; g[to]+=tot-f[to]; solve(to,x); } } void work(int x,int fa) { for(int i=head[x];i;i=e[i].nxt) { int to=e[i].to; if(to==fa) continue; work(to,x); ans=max(ans,down[x]+up[to]+f[to]); ans=max(ans,up[x]+down[to]+g[to]); up[x]=max(up[x],up[to]+f[to]); down[x]=max(down[x],down[to]+g[to]); } } int main() { int n,i,x,y; n=read(); for(i=1;i<=n-1;i++) { x=read(); y=read(); add(x,y); add(y,x); d[x]++; d[y]++; } dfs(1,1); solve(1,1); work(1,1); printf("%.5lf",ans); return 0; }

來源:zr