因爲數據比較水
根本沒用倍增
總之這個題就這麼水過去了
求最大生成樹
再求個LCA
參考鏈接戳這裏( • ̀ω•́ )✧
順便安利一個方法
tarjan求LCA
超好寫的
但是對這個題有點麻煩
參考地址戳這裏(◍´꒳`◍)
#include<iostream>
#include<cstdio>
#include<ctime>
#include<algorithm>
#include<climits>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<cmath>
#define LL long long
using namespace std;
struct nico
{
int xx,yy,zz;
}ed[50005];
int cnt,w[100005],num[100005],nxt[100005],head[10005],f[10005],dep[10005],tot,n,m,dis[10005],fath[10005];
bool vis[10005];
void add(int p1,int p2,int val)
{
cnt++;
w[cnt]=val;
num[cnt]=p2;
nxt[cnt]=head[p1];
head[p1]=cnt;
}
int find(int x)
{
if(f[x]==x) return x;
f[x]=find(f[x]);
return f[x];
}
bool comp(nico a,nico b)
{
return a.zz>b.zz;
}
void maxtree()
{
int i,a,b;
sort(ed+1,ed+m+1,comp);
for(i=1;i<=m;i++)
{
a=find(ed[i].xx);
b=find(ed[i].yy);
if(a!=b)
{
f[a]=b;
add(ed[i].xx,ed[i].yy,ed[i].zz);
add(ed[i].yy,ed[i].xx,ed[i].zz);
tot++;
if(tot==n-1) break;
}
}
}
void dfs(int x)
{
int i;
vis[x]=1;
for(i=head[x];i;i=nxt[i])
if(!vis[num[i]])
{
dep[num[i]]=dep[x]+1;
dis[num[i]]=w[i];
fath[num[i]]=x;
dfs(num[i]);
}
}
int work(int p1,int p2)
{
int m1=1000000,m2=1000000;
if(dep[p1]<dep[p2]) swap(p1,p2);
while(dep[p1]>dep[p2])
{
m1=min(m1,dis[p1]);
p1=fath[p1];
}
while(p1!=p2)
{
m1=min(m1,dis[p1]);
p1=fath[p1];
m2=min(m2,dis[p2]);
p2=fath[p2];
}
return min(m1,m2);
}
int main()
{
int i,fx,fy,q,x,y;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) f[i]=i;
for(i=1;i<=m;i++) scanf("%d%d%d",&ed[i].xx,&ed[i].yy,&ed[i].zz);
maxtree();
for(i=1;i<=n;i++)
if(!vis[i]) dfs(i);
scanf("%d",&q);
for(i=1;i<=q;i++)
{
scanf("%d%d",&x,&y);
fx=find(x);fy=find(y);
if(fx!=fy) printf("-1\n");
else printf("%d\n",work(x,y));
}
return 0;
}