Advertising:
#include <stdio.h>int main(){ puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44307489");}
Test Instructions &
http://blog.csdn.net/vmurder/article/details/44302921
Code: (same title)
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define N 50100#define INF 0x3f3f3f3fusing namespace STD;intN,m;structeli{intV,len,next;} e[n<<1];inthead[n],cnt;BOOLRem[n];inline voidAddintUintVintLen) {e[++cnt].v=v; E[cnt].len=len; E[cnt].next=head[u]; head[u]=cnt;}intF[n],f2[n],son[n];intTreecenter,length;intDFS1 (intXintP) {intI,v; f[x]=f2[x]=0; for(I=head[x];i;i=e[i].next) {v=e[i].v;if(v==p| | REM[V])Continue;intTEMP=DFS1 (V,X);if(Temp>f[x]) {f2[x]=f[x]; F[x]=temp; Son[x]=v; }Else if(Temp>f2[x]) f2[x]=temp; }returnf[x]+1;}intG[n];voidDFS2 (intXintP) {intI,v;if(Max (f[x],g[x]) <length) {Length=max (f[x],g[x]); Treecenter=x; } for(I=head[x];i;i=e[i].next) {v=e[i].v;if(v==p| | REM[V])Continue;if(V==son[x]) G[v]=max (g[x],f2[x]) +1;ElseG[v]=max (G[x],f[x]) +1; DFS2 (V,X); }return;}inline intGet_treecenter (intx) {if(Rem[x])return 0; length=inf,g[x]=0; DFS1 (x,0), DFS2 (x,0);returnTreecenter;}structsummorer{intb;//Weights, sub-tree labelsSummorer (int_a=0,int_b=0): A (_a), B (_b) {}}src[n];inline intCmpa (summorer A,summorer b) {returnA.A<B.A;}inline intCMPB (summorer A,summorer b) {returna.b==b.b?a.a<b.a:a.b<b.b;}intSize[n];voidDFS3 (intXintPintTintLen) {src[++cnt]=summorer (len,t); size[x]=1;intI,v; for(I=head[x];i;i=e[i].next) {v=e[i].v;if(rem[v]| | V==P)Continue; DFS3 (V,x,t,len+e[i].len); SIZE[X]+=SIZE[V]; }return;}intAnsvoidWorkintXintN) {if(!n)return; Rem[x=get_treecenter (x)]=1;intnum=0, I,j,k,v,p; Cnt=0; for(I=head[x];i;i=e[i].next) {v=e[i].v;if(Rem[v])Continue; DFS3 (V,x,++num,e[i].len); } sort (src+1, src+cnt+1, CMPA); P=n; for(i=0; i<=n;i++) { while(i<p&&src[i].a+src[p].a>m) p--;if(i>=p) Break; ans+= (p-i); } sort (src+1, src+cnt+1, CMPB); src[cnt+1].b=-1; for(i=0; i<=n;i=j) { for(j=i+1; src[j].b==src[i].b;j++); for(p=j-1, k=i;k<j;k++) { while(k<p&&src[k].a+src[p].a>m) p--;if(k>=p) Break; ans-= (P-K); } } for(I=head[x];i;i=e[i].next) {v=e[i].v;if(Rem[v])Continue; Work (v,size[v]-1); }return;}voidInit () {ans=cnt=0;memset(REM,0,sizeofREM);memset(Head,0,sizeofHead);}Charuseless[5];intMain () {Freopen ("Test.in","R", stdin);intI,a,b,c; while(scanf("%d%d", &n,&m)!=eof) {init (); while(m--) {scanf("%d%d%d%s", &a,&b,&c,useless); Add (A,b,c), add (B,A,C); }scanf("%d", &m); Work1, N-1);printf("%d\n", ans); }return 0;}
"POJ1987" Distance Statistics = = "POJ1741" Tree partition