有一個樹形結構,每條邊的長度相同,任意兩個節點能夠相互到達。選3個點。兩兩距離相等。有多少種方案?ios
神仙dp方程 啊,這就不寫了數組
而後最難搞的指針的o1 轉移spa
就是對於數組空間的分配很難理解,說是由於數組要移動,因此要開2被的空間,指針
可是我開了三倍。。。。code
像這種轉移方程是總體移位的,能夠考慮長鏈剖分blog
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 using namespace std; 8 #define ll long long 9 #define MAX 100100 10 inline int read() 11 { 12 int x=0,t=1;char ch=getchar(); 13 while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); 14 if(ch=='-')t=-1,ch=getchar(); 15 while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar(); 16 return x*t; 17 } 18 struct Line{int v,next;}e[MAX<<1]; 19 int h[MAX],cnt=1,n; 20 inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;} 21 int dep[MAX],hson[MAX],md[MAX]; 22 void dfs1(int u,int ff) 23 { 24 for(int i=h[u];i;i=e[i].next) 25 { 26 int v=e[i].v;if(v==ff)continue; 27 dfs1(v,u);md[u]=max(md[u],md[v]); 28 if(md[v]>md[hson[u]])hson[u]=v; 29 } 30 md[u]=md[hson[u]]+1; 31 } 32 ll *f[MAX],*g[MAX],tmp[MAX<<4],*id=tmp,ans; 33 void dfs(int u,int ff) 34 { 35 if(hson[u])f[hson[u]]=f[u]+1,g[hson[u]]=g[u]-1,dfs(hson[u],u); 36 f[u][0]=1;ans+=g[u][0]; 37 for(int i=h[u];i;i=e[i].next) 38 { 39 int v=e[i].v;if(v==ff||v==hson[u])continue; 40 f[v]=id;id+=md[v]<<2;g[v]=id;id+=md[v]<<2; 41 dfs(v,u); 42 for(int j=0;j<md[v];++j) 43 { 44 if(j)ans+=f[u][j-1]*g[v][j]; 45 ans+=g[u][j+1]*f[v][j]; 46 } 47 for(int j=0;j<md[v];++j) 48 { 49 g[u][j+1]+=f[u][j+1]*f[v][j]; 50 if(j)g[u][j-1]+=g[v][j]; 51 f[u][j+1]+=f[v][j]; 52 } 53 } 54 } 55 int main() 56 { 57 n=read(); 58 for(int i=1,u,v;i<n;++i)u=read(),v=read(),Add(u,v),Add(v,u); 59 dfs1(1,0);f[1]=id;id+=md[1]<<2;g[1]=id;id+=md[1]<<2; 60 dfs(1,0);printf("%lld\n",ans); 61 return 0; 62 }