uva 11354最小生成树瓶颈路(lca算法实现)(rmq在多校二中有一道题)

  1 /*uva 11865
  2 最小生成树瓶颈路
  3 本来写了个BFS预判和LA5713一样,还线性优化了存储,结果还是T了,
  4 不得不用LCA了,cry瞎
  5 */
  6 #include<iostream>
  7 #include<string.h>
  8 #include<stdio.h>
  9 #include<stdlib.h>
 10 #include<cmath>
 11 #include<algorithm>
 12 #include<queue>
 13 #include<stack>
 14 #include<set>
 15 #include<map>
 16 #define maxn 100100
 17 #define maxm 200100
 18 #define inf 999999999
 19 using namespace std;
 20 int n,m,ques;
 21 vector<int>G[maxn];
 22 vector<int>D[maxn];
 23 int nextint(){int x;scanf("%d",&x);return x;}
 24 struct Edge{
 25     int u,v,d;
 26     bool operator<(const Edge& x ) const{
 27         return d<x.d;
 28     }
 29 }E[maxm],edges[maxm];
 30 int p[maxn];
 31 int findx(int x){
 32     if (x==p[x]) return x;else return p[x]=findx(p[x]);
 33 }
 34 void init()
 35 {
 36     for(int i=0;i<m;i++){
 37         int u,v,d;
 38         u=nextint();v=nextint();d=nextint();
 39         u--,v--;
 40         E[i]=(Edge){u,v,d};
 41     }
 42     sort(E,E+m);
 43 
 44     for(int i=0;i<=n;i++) G[i].clear();
 45     for(int i=0;i<=n;i++) D[i].clear();
 46 }
 47 void MST()
 48 {
 49     for(int i=0;i<=n;i++) p[i]=i;
 50 
 51     for(int i=0;i<m;i++){
 52         int u=E[i].u,v=E[i].v,d=E[i].d;
 53         int pu=findx(u),pv=findx(v);
 54         if (pu==pv) continue;
 55         p[pu]=pv;
 56         G[u].push_back(v);D[u].push_back(d);
 57         G[v].push_back(u);D[v].push_back(d);
 58     }
 59 }
 60 
 61 int root,fa[maxn],cost[maxn],L[maxn];
 62 int anc[maxn][20],maxcost[maxn][20];
 63 struct Node{
 64     int u,l;
 65 };
 66 void dfs(int u,int f,int deep)//预处理fa,L,cost
 67 {
 68     L[u]=deep;
 69     for(int i=0;i<G[u].size();i++){
 70         int d=D[u][i];
 71         int v=G[u][i];
 72         if (v!=f){
 73             fa[v]=u;
 74             cost[v]=d;
 75             dfs(v,u,deep+1);
 76         }
 77     }
 78 }
 79 void preprocess(){
 80     memset(maxcost,0,sizeof(maxcost));
 81     memset(anc,0,sizeof(anc));
 82     for(int i=0;i<n;i++){
 83         anc[i][0]=fa[i];maxcost[i][0]=cost[i];
 84         for(int j=1;(1<<j)<n;j++) anc[i][j]=-1;
 85     }
 86     for(int j=1;(1<<j)<n;j++)
 87        for(int i=0;i<n;i++)
 88          if (anc[i][j-1]!=-1){
 89              int a=anc[i][j-1];
 90              anc[i][j]=anc[a][j-1];
 91              maxcost[i][j]=max(maxcost[i][j-1],maxcost[a][j-1]);
 92          }
 93 }
 94 
 95 int query(int p,int q){
 96     int tmp,log,i;
 97     if(L[p]<L[q]) swap(p,q);
 98     for(log = 1;(1<<log)<=L[p];log++);log--;
 99 
100     int ans=-inf;
101     for(int i=log;i>=0;i--){
102         if (L[p]-(1<<i)>=L[q]){ans=max(ans,maxcost[p][i]);p=anc[p][i];}
103     }
104     if (q==p) return ans;
105 
106     for(int i=log;i>=0;i--){
107         if (anc[p][i]!=-1 && anc[p][i]!=anc[q][i]){
108             ans=max(ans,maxcost[p][i]);p=anc[p][i];
109             ans=max(ans,maxcost[q][i]);q=anc[q][i];
110         }
111     }
112     ans=max(ans,cost[p]);
113     ans=max(ans,cost[q]);
114     return ans;
115 }
116 int cas=0;
117 int main()
118 {
119     while(cin>>n>>m && n>0){
120         if (cas>0) printf("\n");
121         init();MST();
122         dfs(0,-1,0);
123         preprocess();
124         int Q;
125         cin>>Q;
126         while(Q--){
127             int p,q;
128             p=nextint();q=nextint();
129             printf("%d\n",query(p-1,q-1));//注意:节点必须从0开始编号
130         }
131         cas++;
132     }
133     return 0;
134 }

 

posted @ 2014-03-12 22:10  little_w  阅读(264)  评论(0编辑  收藏  举报