Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define sz(x) ((int)(x).size())
- #define endl '\n'
- #define debug(X) cout << #X << " = " << X << endl
- #define rep(i,a,b) for(int(i)=(a);(i)<(b);i++)
- #define SZ(v) (int)v.size()
- using namespace std;
- typedef long long ll;
- const int mod = (int) 1e9 + 7;
- const int oo = (int) 1e9;
- const int N = 1e5 + 2, E = 2e5 + 3;
- int n, m, e;
- int src, dst;
- int head[N], nxt[E], to[E], lev[N], Log[N], par[N], subtree[N];
- int dp[20][N];
- void init()
- {
- e = 0;
- memset(head,-1,sizeof(head));
- memset(subtree,0,sizeof(subtree));
- lev[0]=0;
- Log[1] = 0;
- rep(i,2,N)
- Log[i] = Log[i/2] + 1;
- }
- void addEdge(int f, int t)
- {
- nxt[e] = head[f];
- head[f] = e;
- to[e++] = t;
- }
- void addBiEdge(int a, int b)
- {
- addEdge(a, b);
- addEdge(b, a);
- }
- int DFS(int u, int p)
- {
- par[u] = p;
- for(int k=head[u]; ~k; k=nxt[k])
- {
- int v = to[k];
- if(v==p) continue;
- lev[v]=lev[u]+1;
- subtree[u] += DFS(v,u);
- }
- return 1 + subtree[u];
- }
- void pre()
- {
- memset(dp, -1, sizeof dp);
- for(int i = 0 ; i < N ; i++)
- dp[0][i] = par[i];
- for(int j = 1 ; (1<<j) <= N ;j++)
- for(int i = 0 ; i < N ; i++)
- if(dp[j-1][i] != -1)
- dp[j][i] = dp[j-1][dp[j-1][i]];
- }
- int LCA(int u, int v)
- {
- if(lev[u] < lev[v])
- swap(u, v);
- for(int i = Log[N] ; i >= 0 ; i--)
- if(lev[u] - (1 << i) >= lev[v])
- u = dp[i][u];
- if(u == v)
- return u;
- for(int i = Log[N] ; i >= 0 ; i--)
- if(dp[i][u] != -1 && dp[i][u] != dp[i][v])
- u = dp[i][u], v = dp[i][v];
- return par[u];
- }
- int main()
- {
- init();
- int n,q,a,b;
- int ans= 0;
- cin>>n>>q;
- rep(i,0,n-1)
- {
- cin>>a>>b;
- addBiEdge(--a, --b);
- }
- DFS(0,-1);
- pre();
- a = 2;
- b = 4;
- int c = LCA(a,b);
- cout<<lev[a]<<" "<<lev[b]<<endl;
- printf("%d", lev[a]+lev[b]-2*lev[c]);
- return 0;
- }
- /*
- 5 2
- 1 2
- 1 5
- 2 3
- 2 4
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement