Advertisement
Guest User

1476

a guest
Jan 23rd, 2016
313
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.10 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define Edge pair<pair<int, Vertex*>, int>  
  4. #define mp make_pair
  5. #define MAX 100002
  6.  
  7. class Vertex
  8. {
  9.     public:
  10.     int info, cor, id;
  11.     vector< pair<int, Vertex*> > desc; // <descendant_id, pointer_to_descendant>
  12.     Vertex(int i) : id(i) {};
  13.     void addEdge(Vertex *v, int p) { desc.push_back(mp(p,v)); }
  14. };
  15.  
  16. int L[2*MAX], E[2*MAX], H[MAX], SegTree[4*MAX], visited[MAX], idx; // LCA arrays
  17. class Graph
  18. {
  19.     public:
  20.     vector<Vertex*> vtx;
  21.  
  22.     Graph(int n) { for (int i = 0; i < n; i++) { vtx.push_back(new Vertex(i)); }}
  23.     void addEdge(int i, int j, int p) { vtx[i]->addEdge(vtx[j],p); }
  24.  
  25.     void dfs(int root, int bottleneck)
  26.     {
  27.         if (visited[root]) return;
  28.         visited[root] = 1;
  29.         H[root] = idx;
  30.         E[idx] = root;
  31.         L[idx++] = bottleneck;
  32.  
  33.         for (int i = 0; i < vtx[root]->desc.size(); i++)
  34.         {
  35.             dfs(vtx[root]->desc[i].second->id, min(bottleneck, vtx[root]->desc[i].first));
  36.             E[idx] = root;
  37.             L[idx++] = bottleneck;
  38.         }
  39.     }
  40.      
  41.     void init_lca()
  42.     {
  43.         idx = 0;
  44.         memset(visited,0,sizeof(visited));
  45.         memset(H, -1, sizeof(H));
  46.         dfs(0,11234567);
  47.  
  48.         for (int i = idx; i < 2*idx; i++) SegTree[i] = L[i-idx];
  49.         for (int i = idx-1; i > 0; i--) SegTree[i] = min(SegTree[i<<1], SegTree[i<<1|1]);
  50.     }
  51.      
  52.     int lca(int a, int b)
  53.     {
  54.         b++;
  55.         int lca = 11234567;
  56.         for (a += idx, b += idx; a < b; a >>=1, b>>=1)
  57.         {
  58.             if (a&1) lca = min(lca,SegTree[a++]);
  59.             if (b&1) lca = min(lca,SegTree[--b]);
  60.         }
  61.         return lca;
  62.     }
  63.  
  64.     Graph* prim(int N) // returns the MST
  65.     {
  66.         Graph *MST = new Graph(N);
  67.         vector<int> visited(vtx.size(),0);
  68.         priority_queue<Edge> pq;
  69.          
  70.         int sz = 1;
  71.         visited[0] = 1;
  72.         for (int i = 0; i < vtx[0]->desc.size(); i++)
  73.             pq.push(mp(vtx[0]->desc[i],0));
  74.    
  75.         int idx;
  76.         while (sz < N)
  77.         {
  78.             Edge a = pq.top(); pq.pop();
  79.             while (visited[a.first.second->id]) { a = pq.top(); pq.pop(); }
  80.              
  81.             MST->addEdge(a.first.second->id, a.second, a.first.first);
  82.             MST->addEdge(a.second, a.first.second->id, a.first.first);
  83.             idx = a.first.second->id;
  84.    
  85.             visited[idx] = 1;
  86.             for (int i = 0; i < vtx[idx]->desc.size(); i++)
  87.                 pq.push(mp(vtx[idx]->desc[i],idx));
  88.             sz++;
  89.         }
  90.         return MST;
  91.     }
  92. };
  93.  
  94. int main()
  95. {
  96.     int N,M,I,A,B,P;
  97.     while (scanf("%d %d %d", &N, &M, &I) != EOF)
  98.     {
  99.         Graph G(N);
  100.         for (int i = 0; i < M; i++)
  101.         {
  102.             scanf("%d %d %d", &A, &B, &P); A--; B--;
  103.             G.addEdge(A,B,P);
  104.             G.addEdge(B,A,P);
  105.         }
  106.         Graph *MST = G.prim(N);
  107.         MST->init_lca();
  108.  
  109.         for (int i = 0; i < I; i++)
  110.         {
  111.             scanf("%d %d", &A, &B); A--; B--;
  112.             printf("%d\n", G.lca(min(H[A],H[B]),max(H[A],H[B])));
  113.         }
  114.     }
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement