#include #include #include using namespace std; #include struct UF{ int n; vectorparent,rank; UF(int n_=0):n(n_),parent(n_),rank(n_,1) { for(int i=0;iG[100000]; int parent[17][100000]; int depth[100000]; int dfs(int u,int d,int p) { depth[u]=d; parent[0][u]=p; for(int v:G[u]) { if(v!=p)dfs(v,d+1,u); } } int lca(int u,int v) { if(depth[u]>depth[v])swap(u,v); int d=depth[v]-depth[u]; for(int k=16;k>=0;k--) { if(d>>k&1)v=parent[k][v]; } if(u==v)return u; for(int k=16;k>=0;k--) { if(parent[k][u]!=parent[k][v]) { u=parent[k][u]; v=parent[k][v]; } } return parent[0][u]; } int ccnt[100000]; long dis[100000]; void dfs1(int u,int p) { for(int v:G[u]) { if(v!=p) { dfs1(v,u); ccnt[u]+=ccnt[v]; dis[u]+=dis[v]+ccnt[v]; } } } long dfs2(int u,int p,long par,int Ccnt) { long ret=dis[u]+par+Ccnt; long val=ret; for(int v:G[u]) { if(v!=p) { ret=min(ret,dfs2(v,u,val-dis[v]-ccnt[v],Ccnt+ccnt[u]-ccnt[v])); } } return ret; } main() { cin>>N>>M>>Q; UF uf(N); for(int i=0;i>u>>v; u--,v--; G[u].push_back(v); G[v].push_back(u); uf.unite(u,v); } for(int i=0;i>a>>b; a--,b--; if(uf.same(a,b)) { int ab=lca(a,b); ans+=depth[a]+depth[b]-2*depth[ab]; } else { ccnt[a]++; ccnt[b]++; } } for(int i=0;i