#include<cstdio>
#include<iostream>
#include<cmath>
#include<queue>
#include<stack>
#include<iomanip>
#include<string>
#include<cstring>
#include<vector>
#include<bitset>
#include<algorithm>
using namespace std;
struct data
{
int x,y,z;
};
data tr[50005];
struct node
{
int l,w;
};
node tt;
vector <node> te[10005];
int n,m,a,b,c,q,k=1;
int fa[10005],dep[10005],dis[10005][25],f[10005][25];
bool vis[10005];
bool comp(data a,data b)
{
if (a.z>=b.z) return true;
return false;
}
int find (int x){
if (fa[x]==x) return x;
else {
fa[x]=find(fa[x]);
return fa[x];
}
}
void kruskal(){
for (int i=1;i<=m;i++)
{
int r1=find(tr[i].x);
int r2=find(tr[i].y);
if (r2!=r1){
fa[r2]=r1;//here
tt.l=tr[i].y;tt.w=tr[i].z;
te[tr[i].x].push_back(tt);
tt.l=tr[i].x;tt.w=tr[i].z;
te[tr[i].y].push_back(tt);
}
}
}
void dfs(int x)
{
vis[x]=true;
for (int i=0;i<te[x].size();i++)
if (!vis[te[x][i].l])
{
dep[te[x][i].l]=dep[x]+1;
dis[te[x][i].l][0]=te[x][i].w;
f[te[x][i].l][0]=x;
dfs(te[x][i].l);
}
}
void init()
{
for (int j=1;(1<<j)<=n;j++)
for(int i=1;i<=n;i++)
{
f[i][j]=f[f[i][j-1]][j-1];
dis[i][j]=min(dis[f[i][j-1]][j-1],dis[i][j-1]);
}
}
int lca(int x,int y)
{
int sm=10000000;
if (dep[x]>dep[y]) swap(x,y);
int h=dep[y]-dep[x];
for (int i=0;(1<<i)<=h;i++)
if ((1<<i)&h)
{
sm=min(sm,dis[y][i]);
y=f[y][i];
}
if (x!=y)
{
for (int i=(int)log2(n);i>=0;i--)
if (f[x][i]!=f[y][i])
{
sm=min(sm,min(dis[x][i],dis[y][i]));
x=f[x][i];y=f[y][i];
}
sm=min(sm,min(dis[x][0],dis[y][0]));
x=f[x][0];
}
return sm;
}
int main()
{
freopen ("truck.in","r",stdin);
//freopen ("truck.out","w",stdout);
scanf ("%d%d",&n,&m);
for (int i=1;i<=n;i++) fa[i]=i;
for (int i=1;i<=m;i++)
{
scanf ("%d%d%d",&a,&b,&c);
tr[i].x=a;
tr[i].y=b;
tr[i].z=c;
}
sort(tr+1,tr+m+1,comp);
kruskal();
dep[1]=1;
dfs(1);
init();
scanf ("%d",&q);
for (int i=1;i<=q;i++)
{
scanf ("%d%d",&a,&b);
if (find(a)!=find(b)) printf ("-1\n");
else
{
int s=lca(a,b);
printf ("%d\n",s);
}
}
return 0;
}
NOIP 2013 Day1 T3 货车运输
最新推荐文章于 2018-08-05 08:38:37 发布