Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define Edge pair<pair<int, Vertex*>, int>
- #define mp make_pair
- #define MAX 100002
- class Vertex
- {
- public:
- int info, cor, id;
- vector< pair<int, Vertex*> > desc; // <descendant_id, pointer_to_descendant>
- Vertex(int i) : id(i) {};
- void addEdge(Vertex *v, int p) { desc.push_back(mp(p,v)); }
- };
- int L[2*MAX], E[2*MAX], H[MAX], SegTree[4*MAX], visited[MAX], idx; // LCA arrays
- class Graph
- {
- public:
- vector<Vertex*> vtx;
- Graph(int n) { for (int i = 0; i < n; i++) { vtx.push_back(new Vertex(i)); }}
- void addEdge(int i, int j, int p) { vtx[i]->addEdge(vtx[j],p); }
- void dfs(int root, int bottleneck)
- {
- if (visited[root]) return;
- visited[root] = 1;
- H[root] = idx;
- E[idx] = root;
- L[idx++] = bottleneck;
- for (int i = 0; i < vtx[root]->desc.size(); i++)
- {
- dfs(vtx[root]->desc[i].second->id, min(bottleneck, vtx[root]->desc[i].first));
- E[idx] = root;
- L[idx++] = bottleneck;
- }
- }
- void init_lca()
- {
- idx = 0;
- memset(visited,0,sizeof(visited));
- memset(H, -1, sizeof(H));
- dfs(0,11234567);
- for (int i = idx; i < 2*idx; i++) SegTree[i] = L[i-idx];
- for (int i = idx-1; i > 0; i--) SegTree[i] = min(SegTree[i<<1], SegTree[i<<1|1]);
- }
- int lca(int a, int b)
- {
- b++;
- int lca = 11234567;
- for (a += idx, b += idx; a < b; a >>=1, b>>=1)
- {
- if (a&1) lca = min(lca,SegTree[a++]);
- if (b&1) lca = min(lca,SegTree[--b]);
- }
- return lca;
- }
- Graph* prim(int N) // returns the MST
- {
- Graph *MST = new Graph(N);
- vector<int> visited(vtx.size(),0);
- priority_queue<Edge> pq;
- int sz = 1;
- visited[0] = 1;
- for (int i = 0; i < vtx[0]->desc.size(); i++)
- pq.push(mp(vtx[0]->desc[i],0));
- int idx;
- while (sz < N)
- {
- Edge a = pq.top(); pq.pop();
- while (visited[a.first.second->id]) { a = pq.top(); pq.pop(); }
- MST->addEdge(a.first.second->id, a.second, a.first.first);
- MST->addEdge(a.second, a.first.second->id, a.first.first);
- idx = a.first.second->id;
- visited[idx] = 1;
- for (int i = 0; i < vtx[idx]->desc.size(); i++)
- pq.push(mp(vtx[idx]->desc[i],idx));
- sz++;
- }
- return MST;
- }
- };
- int main()
- {
- int N,M,I,A,B,P;
- while (scanf("%d %d %d", &N, &M, &I) != EOF)
- {
- Graph G(N);
- for (int i = 0; i < M; i++)
- {
- scanf("%d %d %d", &A, &B, &P); A--; B--;
- G.addEdge(A,B,P);
- G.addEdge(B,A,P);
- }
- Graph *MST = G.prim(N);
- MST->init_lca();
- for (int i = 0; i < I; i++)
- {
- scanf("%d %d", &A, &B); A--; B--;
- printf("%d\n", G.lca(min(H[A],H[B]),max(H[A],H[B])));
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement