蒟蒻调这个题调了一上午,已经把数组开的很大了,但还是RE,求各位大佬看看QAQ
#include<bits/stdc++.h>
#define N 1000050
#define int long long
using namespace std;
int n,m,fa[N<<1],f[N<<1][100],lg[N<<1],weight[N<<1],vis[N<<1],ct=0,dep[N<<1],head[N<<1],cnt,q;
vector<int>v[N<<1];
inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch-'0'),ch=getchar();
return x*f;
}
struct Edge{
int u,v,w,next;
inline friend bool operator < (Edge x,Edge y){
return x.w>y.w;
}
}e1[N<<1];
inline void adde1(int u,int v,int w){
e1[++cnt].u=u;
e1[cnt].v=v;
e1[cnt].w=w;
}
inline int find(int x){
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
void dfs(int x,int fl)
{
f[x][0]=fl;
for(int i=1;i<=lg[dep[x]];i++)
{
f[x][i]=f[f[x][i-1]][i-1];
}
for(int i=0;i<v[x].size();i++)
{
if(v[x][i]==fl) continue;
dep[v[x][i]]=dep[x]+1;
dfs(v[x][i],x);
}
}
int LCA(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
while(dep[x]>dep[y]) x=f[x][lg[dep[x]-dep[y]]-1];
if(x==y) return x;
for(int i=lg[dep[x]]-1;i>=0;i--)
{
if(f[x][i]==f[y][i]) continue;
x=f[x][i];y=f[y][i];
}
return f[x][0];
}
inline void init(){
for(register int i=1;i<=(N<<1)-9;++i){
lg[i]=lg[i-1]+(1<<lg[i-1]==i);
}
for(register int i=1;i<=n<<1;++i){
fa[i]=i;
}
}
signed main(){
scanf("%lld%lld",&n,&m);
init();
for(register int i=1;i<=m;++i){
int x=read(),y=read(),z=read();
adde1(x,y,z);
}
sort(e1+1,e1+m+1);
cnt=1;
for(register int i=1;i<n;++i){
while(find(e1[cnt].u)==find(e1[cnt].v))++cnt;
if(cnt>m)break;
// printf("%d\n",cnt);
v[n+i].push_back(fa[e1[cnt].u]);
v[n+i].push_back(fa[e1[cnt].v]);
v[fa[e1[cnt].u]].push_back(n+i);
v[fa[e1[cnt].v]].push_back(n+i);
fa[fa[e1[cnt].u]]=n+i;
fa[fa[e1[cnt].v]]=n+i;
weight[i+n]=e1[cnt].w;
}
weight[0]=-1;
for(register int i=1;i<=n;++i){
if(!vis[find(i)]){
vis[fa[i]]=1;
v[0].push_back(fa[i]);
v[fa[i]].push_back(0);
}
}
dfs(0,-1);
scanf("%lld",&q);
for(register int i=1;i<=q;++i){
int x,y;
scanf("%lld%lld",&x,&y);
printf("%lld\n",weight[LCA(x,y)]);
}
return 0;
}
谢谢QAQ