zoukankan      html  css  js  c++  java
  • 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("
    ");
    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
    ",query(p-1,q-1));//注意:节点必须从0开始编号
    130         }
    131         cas++;
    132     }
    133     return 0;
    134 }
  • 相关阅读:
    Python学习第七天——随机码生成
    Python学习第六天——Fibonacci
    Python学习第五天——递归函数
    Python学习第四天——文件修改
    Python学习第三天——三级目录
    Python学习第二天——购物车程序
    Python学习第一天——用户名登录退出
    Linux什么时候在pc机上有一席之地
    关于系统设计时性能以及可扩展性的考虑
    HyberLedger Fabric学习(4)-chaincode学习(操作人员)
  • 原文地址:https://www.cnblogs.com/little-w/p/3597437.html
Copyright © 2011-2022 走看看