给出K个路径, 统计经过每条边的次数。
边的标记 与 下面的u一致
const int maxn = 100008 ;
int n ;
int siz[maxn] , top[maxn] , son[maxn] ;
int dep[maxn] , tid[maxn] , fa[maxn] , rank[maxn] ;
int head[maxn] , to[maxn*2] , next[maxn*2] , edge ;
int tim ;
void init(){
memset(head , -1 , sizeof(head)) ;
memset(son , -1 , sizeof(son)) ;
tim = edge = 0 ;
}
void addedge(int u , int v){
to[edge] = v , next[edge] = head[u] , head[u] = edge++ ;
to[edge] = u , next[edge] = head[v] , head[v] = edge++ ;
}
void dfs1(int u , int father , int d){
dep[u] = d ;
fa[u] = father ;
siz[u] = 1 ;
for(int i = head[u] ; i != -1 ; i = next[i]){
int v = to[i] ;
if(v != father){
dfs1(v , u , d+1) ;
siz[u] += siz[v] ;
if(son[u] == -1 || siz[v] > siz[son[u]]) son[u] = v ;
}
}
}
void dfs2(int u , int tp){
top[u] = tp ;
tid[u] = ++tim ;
rank[tid[u]] = u ;
if(son[u] == -1) return ;
dfs2(son[u] , tp) ;
for(int i = head[u] ; i != -1 ; i = next[i]){
int v = to[i] ;
if(v != son[u] && v != fa[u]) dfs2(v , v) ;
}
}
int c[maxn] ;
int lowbit(int x){
return x & (-x) ;
}
int in(int i , int d){
for( ; i <= n ; i += lowbit(i)) c[i] += d ;
}
int gsum(int i){
int t = 0 ;
for( ; i >= 1 ; i -= lowbit(i)) t += c[i] ;
return t ;
}
struct Line{
int u , v , id ;
}li[maxn] ;
void change(int x , int y){
while(top[x] != top[y]){
if(dep[top[x]] < dep[top[y]]) std::swap(x , y) ;
in(tid[top[x]] , 1) ;
in(tid[x] + 1 , -1) ;
x = fa[top[x]] ;
}
if(x == y) return ;
if(dep[x] > dep[y]) std::swap(x , y) ;
in(tid[x]+1 , 1) ;
in(tid[y]+1 , -1) ;
}
int main(){
int i , j , u , v , k ;
while(scanf("%d" , &n) != EOF){
init() ;
for(i = 1 ; i < n ; i++){
scanf("%d%d" , &li[i].u , &li[i].v) ;
li[i].id = i ;
addedge(li[i].u , li[i].v) ;
}
dfs1(1 , 0 , 0) ;
dfs2(1 , 1) ;
for(i = 1 ; i < n ; i++){
if(tid[li[i].u] < tid[li[i].v])
std::swap(li[i].u , li[i].v) ;
}
memset(c , 0 , sizeof(c)) ;
scanf("%d" , &k) ;
for(i = 1 ; i <= k ; i++){
scanf("%d%d" , &u , &v) ;
change(u , v) ;
}
for(i = 1 ; i < n ; i++) printf("%d " , gsum(tid[li[i].u])) ;
puts("") ;
}
return 0 ;
}