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 101 102 103 104 105 106 107 108 109
| #include<bits/stdc++.h> using namespace std; const int maxn=100005; const int inf=INT_MAX; int n,m; int x,y,c; int qs; struct edge{ int v,w,from; edge(int a=0,int b=0,int c=0){ from=a;v=b;w=c; } };
vector<edge> g[maxn]; edge ed[5*maxn]; int dad[5*maxn]; int tot; int f[maxn][20]; int w[maxn][20]; int dep[maxn];
int find(int x){ if(dad[x]==x)return x; return dad[x]=find(dad[x]); }
bool cmp(edge a,edge b){ return a.w>b.w; }
void kru(){ sort(ed+1,ed+m+1,cmp); for (int i=1;i<=m;i++){ int xx=ed[i].from;int yy=ed[i].v; if(find(xx)!=find(yy)){ g[xx].push_back(edge(xx,yy,ed[i].w)); g[yy].push_back(edge(yy,xx,ed[i].w)); dad[find(xx)]=dad[find(yy)]; } } }
void dfs(int u,int fa){ dep[u]=dep[fa]+1; f[u][0]=fa; for (int i=1;i<=19;i++){ f[u][i] = f[f[u][i-1]][i-1]; w[u][i] = min(w[u][i-1],w[f[u][i-1]][i-1]); } for (int i=0;i<g[u].size();i++){ if(g[u][i].v==fa)continue; w[g[u][i].v][0] = g[u][i].w; dfs(g[u][i].v,u); } }
int lca(int x,int y){ int ans=inf; if(dep[x]<dep[y])swap(x,y); for (int i=19;i>=0;i--){ if(dep[f[x][i]]>=dep[y]){ ans=min(ans,w[x][i]);x=f[x][i]; } } if(x==y)return ans; for (int i=19;i>=0;i--){ if(f[x][i]!=f[y][i]){ ans = min(ans,w[x][i]); ans = min(ans,w[y][i]); x=f[x][i];y=f[y][i]; } } ans = min(ans,w[x][0]);ans = min(ans,w[y][0]); return ans; }
int main(){ cin>>n>>m; for (int i=1;i<=m;i++){ cin>>x>>y>>c; ed[++tot] = edge(x,y,c); dad[i]=i; } for (int i=1;i<=n;i++)dad[i]=i; kru(); dfs(1,0); for (int i=1;i<=n;i++){ if(dep[i]==0){ dfs(i,0); } } cin>>qs; for (int i=1;i<=qs;i++){ cin>>x>>y; if(find(x)!=find(y)){ cout<<-1<<endl;continue; } cout<<lca(x,y)<<endl; } return 0; }
|