就是用W[1e6][21]表示节点到它祖先的最大限重,但问题是,我这个W数组竟然没存进去数,可我用F[1e6][21]表示节点的祖先是谁,这个数组就存进去数了,为什么啊QAQ
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
const int inf=0x3f3f3f3f;
typedef long long ll;
int n,m;
struct Edge
{
int from,to,dist;
}Edges[maxn];
int cnt=0;
int f[maxn];
vector<Edge>edges;
vector<int>G[maxn];
void add(int from,int to,int dist)
{
edges.push_back({from,to,dist});
int m=edges.size();
G[from].push_back(m-1);
}
bool cmp(Edge a,Edge b)
{
return a.dist>b.dist;
}
int find(int x)
{
return f[x]==x?x:find(f[x]);
}
void kruskal()
{
sort(Edges+1,Edges+1+cnt,cmp);
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=1;i<=m;i++)
{
int x=find(Edges[i].from),y=find(Edges[i].to);
if(x!=y)
{
f[x]=y;
add(Edges[i].from,Edges[i].to,Edges[i].dist);
add(Edges[i].to,Edges[i].from,Edges[i].dist);
}
}
}
int F[maxn][21],W[maxn][21],deep[maxn];
bool vis[maxn];
void dfs(int u,int fa,int d)
{
vis[u]=true;
deep[u]=deep[fa]+1;
F[u][0]=fa;
W[u][0]=d;
for(int i=1;(1<<i)<=deep[u];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++)
{
Edge e=edges[G[u][i]];
int v=e.to;
if(vis[v])
continue;
dfs(v,u,e.dist);
}
}
int LCA(int x,int y)
{
if(find(x)!=find(y))
return -1;
int ans=inf;
if(deep[x]>deep[y])
swap(x,y);
for(int i=20;i>=0;i--)
{
if(deep[F[y][i]]>=deep[x])
{
y=F[y][i];
cout<<ans<<" "<<W[y][i]<<endl;
ans=min(ans,W[y][i]);
}
}
//cout<<ans;
if(x==y)
return ans;
for(int i=20;i>=0;i--)
{
if(F[x][i]!=F[y][i])
{
x=F[x][i];
y=F[y][i];
ans=min(ans,min(W[x][i],W[y][i]));
}
}
//cout<<" "<<ans;
ans=min(ans,min(W[x][0],W[y][0]));
//cout<<" "<<ans<<endl;
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(int i=0;i<m;i++)
{
int x,y,z;
cin>>x>>y>>z;
Edges[++cnt].from=x;
Edges[cnt].to=y;
Edges[cnt].dist=z;
}
kruskal();
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
deep[i]=0;
2dfs(i,0,0);
W[i][0]=inf;
F[i][0]=i;
}
}
int q;
cin>>q;
for(int i=0;i<q;i++)
{
int x,y;
cin>>x>>y;
cout<<LCA(x,y)<<endl;
}
}