WA On#13:Wrong Answer.wrong answer On line 10791 column 2, read 9, expected 8.
WA On#16:Wrong Answer.wrong answer On line 19156 column 2, read 5, expected 4.
之前暴力逐层跳父亲已经A过了,不知道为啥写树剖就寄了
#include <cstdio>
#include <iostream>
#include <string>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstring>
#include <unordered_map>
#define ll long long
using namespace std;
int n,m,bcj1[10010],q,dep[10010],vis[10010],son[10010],f[10010],dfn[10010],fdf[10010],big[10010],cnt,x,y,qz[10010],f1[10010],to[10010];
vector <pair<int,int> > ve1[10010];
vector <int> root;
/*Segment Tree*/
struct Node{
int l,r,mid;
int sum,tag1,minn;
Node *lson,*rson;
}*head;
Node *build(int l,int r){
Node *p=new(Node);
p->l=l;p->r=r;p->mid=(l+r)>>1;p->tag1=0;
if(l==r){
p->sum=p->minn=qz[fdf[l]];return p;
}
p->lson=build(l,p->mid);
p->rson=build(p->mid+1,r);
p->sum=p->lson->sum+p->rson->sum;
p->minn=min(p->lson->minn,p->rson->minn);
return p;
}
int query(int x,int y,Node *p){
if(x<=p->l&&p->r<=y){
return p->minn;
}
int res=0x7fffffff;
if(x<=p->mid){
res=min(res,query(x,y,p->lson));
}
if(y>p->mid){
res=min(res,query(x,y,p->rson));
}
return res;
}
/*Segment Tree*/
struct edge{
int x,y,z;
}e[50010];
bool cmp1(edge x,edge y){
return x.z>y.z;
}
int ff0(int x){
if(bcj1[x]==x) return x;
return bcj1[x]=ff0(bcj1[x]);
}
inline void kru(){
int f1,f2;
for(int i=1;i<=m;i++){
f1=ff0(e[i].x);
f2=ff0(e[i].y);
if(f1!=f2){
ve1[e[i].x].push_back(make_pair(e[i].y,e[i].z));
ve1[e[i].y].push_back(make_pair(e[i].x,e[i].z));
bcj1[f1]=f2;
}
}
}
inline void liantong(){
/* int lstf=ff0(1),tmp;
root.push_back(1);
for(int i=2;i<=n;i++){
tmp=ff0(i);
if(tmp!=lstf){
lstf=tmp;
root.push_back(i);
}
}*/
for(int i=1;i<=n;i++){
if(to[ff0(i)]==0){
root.push_back(i);
to[ff0(i)]=1;
}
}
}
void dfs1(int nod,int dp){
dep[nod]=dp;son[nod]=1;
int tmax=0,tb=0;
for(int i=0;i<ve1[nod].size();i++){
if(vis[ve1[nod][i].first]==0){
vis[ve1[nod][i].first]=1;
dfs1(ve1[nod][i].first,dp+1);
qz[ve1[nod][i].first]=ve1[nod][i].second;
f1[ve1[nod][i].first]=nod;
son[nod]+=son[ve1[nod][i].first];
if(son[ve1[nod][i].first]>tmax){
tb=ve1[nod][i].first;tmax=son[ve1[nod][i].first];
}
}
}
big[nod]=tb;
}
void dfs2(int nod,int ld){
f[nod]=ld;dfn[nod]=++cnt;fdf[cnt]=nod;
if(big[nod]){
vis[big[nod]]=1;
dfs2(big[nod],ld);
}
for(int i=0;i<ve1[nod].size();i++){
if(vis[ve1[nod][i].first]==0){
vis[ve1[nod][i].first]=1;
dfs2(ve1[nod][i].first,ve1[nod][i].first);
}
}
}
int lca(int x,int y){
int res=0x7fffffff;
while(f[x]!=f[y]){
if(dep[f[x]]<dep[f[y]])swap(x,y);
res=min(res,query(dfn[f[x]],dfn[x],head));
x=f1[f[x]];
/* if(x==0){
res=min(res,query(dfn[f[y]],dfn[y],head));return res;
}*/
}
if(x==y) return res;
if(dep[x]>dep[y]) swap(x,y);
res=min(res,query(dfn[big[x]],dfn[y],head));
return res;
}
signed main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z);
}
for(int i=1;i<=n;i++){
bcj1[i]=i;
}
sort(e+1,e+1+m,cmp1);
kru();
liantong();
for(int i=0;i<root.size();i++){
vis[root[i]]=1;
dfs1(root[i],1);
}
for(int i=1;i<=n;i++){
vis[i]=0;
}
for(int i=0;i<root.size();i++){
vis[root[i]]=1;
dfs2(root[i],root[i]);
qz[dfn[root[i]]]=0x7fffffff;
}
head=build(1,cnt);
scanf("%d",&q);
for(int i=1;i<=q;i++){
scanf("%d%d",&x,&y);
if(ff0(x)!=ff0(y)){
puts("-1");continue;
}
printf("%d\n",lca(x,y));
}
return 0;
}