1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
   | 
 
 
 
 
 
 
    #include<bits/stdc++.h> using namespace std;  
  const int V=1e5+5; int to[V<<1],nex[V<<1],head[V],w[V],cnt,n; void ini(){cnt=-1;for(int i=0;i<=n;i++) head[i]=-1;} void addEdge(int u,int v){to[++cnt]=v;nex[cnt]=head[u];head[u]=cnt;}   int dep[V],dad[V],siz[V],son[V],chain[V],dfn[V]; void dfs1(int u,int father){     dep[u]=dep[father]+1;     dad[u]=father, siz[u]=1, son[u]=-1;     for(int i=head[u];~i;i=nex[i]){         int v=to[i];         if(v==father)continue;         dfs1(v,u);         siz[u]+=siz[v];         if(son[u]==-1||siz[son[u]]<siz[v]) son[u]=v;     } } void dfs2(int u,int s,int&step){     dfn[u]=++step;     chain[u]=s;     if(son[u]!=-1) dfs2(son[u],s,step);     for(int i=head[u];~i;i=nex[i]){         int v=to[i];         if(v!=son[u]&&v!=dad[u]) dfs2(v,v,step);     } } int lca(int x,int y){     int res=0;     while(chain[x]!=chain[y]){         if(dep[chain[x]]<dep[chain[y]]) swap(x,y);                   x=dad[chain[x]];     }     if(dep[x]>dep[y]) swap(x,y);     return x;      }  
 
 
 
 
 
 
 
 
 
   
  int f[V]; int find(int x){return x==f[x]?x:f[x]=find(f[x]);} bool cmpVec(const vector<int>&a,const vector<int>&b){return a[2]<b[2];} void reBuildTree(vector<vector<int> >&edges){   sort(edges.begin(),edges.end(),cmpVec);   ini();   for(int i=0;i<=n*2;i++) f[i]=i;   for(int i=0;i<edges.size();i++){     int u=edges[i][0];     int v=edges[i][1];     if(find(u)==find(v)) continue;     head[++n]=-1;     addEdge(n,f[u]);     addEdge(n,f[v]);     w[n]=edges[i][2];     f[f[u]] = f[f[v]] = n;   } }   int main(){   int m,k;   cin>>n>>m>>k;   vector<vector<int> > edges(m,vector<int>(3));   for(int i=0;i<m;i++) cin>>edges[i][0]>>edges[i][1]>>edges[i][2];     reBuildTree(edges);     int step=0;   dfs1(n,0);   dfs2(n,n,step);     while(k--){     int x,y;     cin>>x>>y;     cout<<w[lca(x,y)]<<endl;   } }
 
  |