没查出来哪里错了,样例输出:
0
-1
0
代码(链式前向星存图):
#include<iostream>
#include<algorithm>
using namespace std;
struct graph{
struct edge{
int u,v,w,nxt;
}e[1000001];
int head[10001],cnt=1;
}g1,g2;
int n,m,q;
void add(graph &g,int u,int v,int w){
g.e[g.cnt]=graph::edge({u,v,w,g.head[u]});
g.head[u]=g.cnt++;
}
int fa[10001];
int find(int x){
if (fa[x]==x){
return x;
}
return fa[x]=find(fa[x]);
}
void merge(int x,int y){
x=find(x),y=find(y);
fa[y]=x;
}
bool query(int x,int y){
x=find(x),y=find(y);
return fa[x]==fa[y];
}
void kruskal(graph &input,graph &ans){
for(int i=1;i<=n;i++){
fa[i]=i;
}
sort(input.e+1,input.e+m+1,[](const graph::edge &lhs,const graph::edge &rhs){
return lhs.w>rhs.w;
});
for(int i=1;i<=m;i++){
cout << "get path: <" << input.e[i].u << ", " << input.e[i].v << ">.\n";
if(query(input.e[i].u,input.e[i].v)) continue;
merge(input.e[i].u,input.e[i].v);
add(ans,input.e[i].u,input.e[i].v,input.e[i].w);
add(ans,input.e[i].v,input.e[i].u,input.e[i].w);
}
}
int dis[10001],dep[10001];
bool vis[10001];
int parent[10001][20],weight[10001][20];
void dfs(int i){
// cout << "dfs id: " << i << ".\n";
for(int j=g2.head[i];j;j=g2.e[j].nxt){
int to=g2.e[j].v,len=g2.e[j].w;
if(vis[to]) continue;
vis[to]=true;
dis[to]=min(dis[i],len);
dep[to]=dep[i]+1;
parent[to][0]=i;
weight[to][0]=len;
dfs(to);
}
}
void lca_pre(){
for(int j=1;(1<<j)<=n;j++){
for(int i=1;i<=n;i++){
parent[i][j]=parent[parent[i][j-1]][j-1];
weight[i][j]=min(weight[i][j-1],weight[parent[i][j-1]][j-1]);
}
}
}
int lca(int a,int b){
if(dep[a]<dep[b]) swap(a,b);
int ans=2147483647;
//a的深度比b大,提升a的深度
int i=-1,j;
while((1<<(i+1))<=dep[b]) ++i;
for(j=i;j>=0;--j){
if(dep[a]-(1<<j)>=dep[b]){
ans=min(ans,weight[a][j]);
a=parent[a][j];
}
}
if(a==b) return a;
for(j=i;j>=0;--j){
if(parent[a][j]!=parent[b][j]){
ans=min(ans,min(weight[a][j],weight[b][j]));
a=parent[a][j],b=parent[b][j];
}
}
ans=min(ans,min(weight[a][0],weight[b][0]));
return ans;
}
int main(){
cin >> n >> m;
for(int i=1;i<=m;i++){
int u,v,w;
cin >> u >> v >> w;
add(g1,u,v,w);
add(g1,v,u,w);
}
kruskal(g1,g2);
// cout << "end kruskal.\n";
for(int i=1;i<=n;i++){
if(!vis[i]){
vis[i]=true;
// cout << "search id:" << i << ".\n";
dfs(i);
}
}
// cout << "start lca_pre.\n";
lca_pre();
// cout << "end lca_pre.\n";
cin >> q;
while(q--){
int a,b;
cin >> a >> b;
if(query(a,b)==false){
cout << "-1\n";
} else{
cout << lca(a,b) << '\n';
}
}
return 0;
}