已经调吐了,求dalao帮忙看看/kk
有一些调试所以看上去比较畸形(没有也畸形
#include<queue>
#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
vector<pair<int,int> > g[50012];
int z[10012];
int fa[10012][21],w[10012][21];
bool vis[10012];
int n,m,q,maxk=19,len=0;
int h[10012];
struct STR {
int x,y,d;
}a[50012];
bool cmp(STR x,STR y) {
return x.d>y.d;
}
int _find(int x) {
if(x==z[x])return x;
else return z[x]=_find(z[x]);
}
void add(int x,int y) {
z[z[x]]=z[y];
}
void bfs() {
queue<int> q;
q.push(1);
vis[1]=true;
h[1]=0;
while(!q.empty()) {
int k=q.front();
q.pop();
for(int i=0; i<g[k].size(); i++) {
int v=g[k][i].first;
int d=g[k][i].second;
if(!vis[v]) {
// printf("\n%d %d %d\n",k,v,d);
// printf("9999999 ");
w[v][0]=d;
fa[v][0]=k;
h[v]=h[k]+1;
vis[v]=true;
q.push(v);
}
}
}
// puts("");
// printf("%d %d %d",fa[1][1],fa[2][1],fa[3][1]);
// for(int i=0;i<=maxk;i++){
// for(int j=1;i<=n;i++){
// printf("%d ",w[j][i]);
// }
// puts("");
// }
return ;
}
void ini() {
for(int i=0; i<=maxk; i++) {
for(int j=1; j<=n; j++) {
fa[j][i]=fa[fa[j][i-1]][i-1];
w[j][i]=min(w[j][i-1],w[fa[j][i-1]][i-1]);
}
}
// for(int i=1; i<=maxk; i++) {
// for(int j=1; j<=n; j++) {
// printf("%d ",w[j][i]);
// }
// puts("");
// }
// printf("%d %d %d",fa[1][1],fa[2][1],fa[3][1]);
return ;
}
int LCA(int x,int y) {
if(_find(x)!=_find(y)) return -1;
int ans=9999999;
// printf("%d\n",ans);
if(h[x]<h[y])swap(x,y);
int k=h[x]-h[y];
for(int i=0; i<=maxk; i++) {
int q=(1<<i);
if(q&k) {
x=fa[x][i];
ans=min(ans,w[x][i]);
// printf("%d ",ans);
}
}
// puts("");
// if(x==y)return ans;
for(int i=maxk; i>=0; i--) {
if(fa[x][i]!=fa[y][i]) {
x=fa[x][i];
y=fa[y][i];
ans=min(ans,w[x][i]);
ans=min(ans,w[y][i]);
// printf("%d ",ans);
}
}
// puts("");
ans=min(ans,min(w[x][0],w[y][0]));
return ans;
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1; i<=m; i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].d);
sort(a+1,a+m+1,cmp);
for(int i=1; i<=n; i++)z[i]=i;
for(int i=1; i<=m; i++) {
int x=a[i].x,y=a[i].y,d=a[i].d;
if(_find(x)!=_find(y)) {
if(len>=n-1)break;
add(x,y);
g[x].push_back(make_pair(y,d));
g[y].push_back(make_pair(x,d));
len++;
}
}
// for(int i=1;i<=n;i++){
// for(int j=0;j<g[i].size();j++){
// printf("%d %d ",g[i][j].first,g[i][j].second);
// }
// puts("");
// }
fa[1][0]=-1;
bfs();
ini();
// for(int i=0; i<=maxk; i++) {
// for(int j=1; j<=n; j++) {
// printf("%d ",w[j][i]);
// }
// puts("");
// }
scanf("%d",&q);
for(int i=1; i<=q; i++) {
int u,v;
scanf("%d%d",&u,&v);
printf("%d\n",LCA(u,v));
}
return 0;
}
主要问题是存最小距离的w数组在我初始化后全是零
求解答