Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int N= 1e4+1;
- const int C= 1e2+1;
- int f[N][C], n, m, c, hmax, h[N], Log[N], dp[N][20];
- vector<int> a[N], Color[C];
- void DeepFirstSearch(int u, int high){
- h[u]= high;
- hmax= max(h[u], hmax);
- for (int i=0; i<a[u].size(); i++){
- int v= a[u][i];
- if (v== dp[u][0]) continue;
- dp[v][0]= u;
- DeepFirstSearch(v, high+1);
- }
- }
- int make_ans(int u, int v){
- if (h[u]< h[v]) swap(u, v);
- int k= Log[h[u]], i1= u, i2= v;
- for (int i=k; i>=0; i--) if (h[u]-(1<<i)>= h[v]) u= dp[u][i];
- if (u==v) return h[i1]-h[i2];
- for (int i=k; i>=0; i--)
- if (dp[u][i]!= dp[v][i]&& dp[u][i]!=-1){
- u= dp[u][i];
- v= dp[v][i];
- }
- int ans= dp[u][0];
- return h[i1]+h[i2]-h[ans];
- }
- int main(){
- scanf("%d", &n);
- for (int i=1; i<=n; i++) {
- int u, v;
- scanf("%d%d", &u, &v);
- a[u].push_back(v);
- a[v].push_back(u);
- }
- scanf("%d", &c);
- for (int i=1; i<=n; i++) {
- int Vertex;
- scanf("%d", &Vertex);
- Color[i].push_back(Vertex);
- }
- DeepFirstSearch(1,0);
- for (int i=2; i<=hmax; i++) Log[i]= Log[i/2]+1;
- int k= Log[hmax];
- for (int j=1; j<=k; j++)
- for (int i=1; i<=n; i++) dp[i][j]= -1;
- for (int j=1; j<=k; j++)
- for (int i=1; i<=n; i++)
- if (dp[i][j-1]!=-1) dp[i][j]= dp[dp[i][j-1]][j-1];
- for (int i=1; i<=n; i++)
- for (int j=1; j<=c; j++) f[i][j]= 1e5+1;
- for (int j=1; j<=c; j++)
- for (int i=1; i<=n; i++)
- for (int k=0; k<Color[j].size(); k++){
- int Vertex= Color[j][k];
- int ans= make_ans(Vertex, i);
- f[i][j]= min(f[i][j], ans);
- }
- scanf("%d", &m);
- for (int i=1; i<=m; i++){
- int u, v;
- scanf("%d%d", &u, &v);
- printf("%d\n", f[u][v]);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement