[Topic link]
http://poj.org/problem?id=3417
Algorithm
Differential on tree
Code
#include <algorithm>#include<bitset>#include<cctype>#include<cerrno>#include<clocale>#include<cmath>#include<complex>#include<cstdio>#include<cstdlib>#include<cstring>#include<ctime>#include<deque>#include<exception>#include<fstream>#include<functional>#include<limits>#include<list>#include<map>#include<iomanip>#include<ios>#include<iosfwd>#include<iostream>#include<istream>#include<ostream>#include<queue>#include<Set>#include<sstream>#include<stdexcept>#include<streambuf>#include<string>#include<utility>#include<vector>#include<cwchar>#include<cwctype>#include<stack>#include<limits.h>using namespacestd;#defineMAXN 100010#defineMaxlog 20structedge{intTO,NXT;} E[MAXN<<1];intI,n,m,tot,u,v,ans;intSUM[MAXN],DEP[MAXN],HEAD[MAXN];intAnc[maxn][maxlog];inlinevoidAddedge (intUintv) {Tot++; E[tot]=(Edge) {V,head[u]}; Head[u]=tot;} InlinevoidDFS1 (intu) { inti,v; for(i =1; i < Maxlog; i++) { if(Dep[u] < (1<< i)) Break; Anc[u][i]= Anc[anc[u][i-1]][i-1]; } for(i = head[u]; i; i =e[i].nxt) {v=e[i].to; if(V! = anc[u][0]) {Dep[v]= Dep[u] +1; anc[v][0] =u; DFS1 (v); }}}inlinevoidDFS2 (intu) { inti,v; for(i = head[u]; i; i =e[i].nxt) {v=e[i].to; if(v = = anc[u][0])Continue; DFS2 (v); Sum[u]+=Sum[v]; }}inlineintLcaintUintv) { inti,t; if(Dep[u] >Dep[v]) swap (U,V); T= Dep[v]-Dep[u]; for(i =0; i < Maxlog; i++) { if(T & (1<<i)) v=Anc[v][i]; } if(U = = v)returnu; for(i = Maxlog-1; I >=0; i--) { if(Anc[u][i]! =Anc[v][i]) {u=Anc[u][i]; V=Anc[v][i]; } } returnanc[u][0];} intMain () { while(SCANF ("%d%d", &n,&m)! =EOF) {Tot=0; memset (ANC,0,sizeof(ANC)); memset (DEP,0,sizeof(DEP)); for(i =1; I <= N; i++) {Head[i]=0; Sum[i]=0; } for(i =1; I < n; i++) {scanf ("%d%d",&u,&v); Addedge (U,V); Addedge (V,u); } DFS1 (1); for(i =1; I <= m; i++) {scanf ("%d%d",&u,&v); Sum[u]++; sum[v]++; Sum[lca (u,v)]-=2; } DFS2 (1); Ans=0; for(i =2; I <= N; i++) { if(Sum[i] = =0) ans + =m; if(Sum[i] = =1) ans++; } printf ("%d\n", ans); } return 0; }
[POJ 3417] Network