为什么我经过dfs后输出的val数组都为0?
//kruska找最大生成树(保证所经过权值最大)的最小边
#include<bits/stdc++.h>
using namespace std;
#define N 20100
#define ll long long
struct node
{
int v,u,w;
}e[N];
struct leaf
{
int u,v,w;
}tr[N*2];
int cnt=0,n,m,q;
int h[N],par[N],dis[N];
int dep[N],st[N][20],val[N];//lca
bool cmp(node a,node b)//排序的比较都是bool
{
return a.w>b.w;
}
void add(int u,int v,int w)
{
cnt++;
tr[cnt].v=v;
tr[cnt].w=w;
tr[cnt].u=h[u];
h[u]=cnt;
}
void init(int n)
{
for(int i=1;i<=n;i++)
par[i]=i;
}
int find(int x)
{
if(x==par[x])
return par[x];
else
{
par[x]=find(par[x]);
return par[x];
}
}
void kruskal()
{
sort(e+1,e+n+1,cmp);
init(2*n);//双向边
for(int i=1;i<=m;i++)
{
int fx=find(e[i].u);
int fy=find(e[i].v);
if(fx^fy)
{
par[fx]=par[fy];
add(e[i].u,e[i].v,e[i].w);
add(e[i].v,e[i].u,e[i].w);
}
}
}
void dfs(int x,int f)
{
dep[x]=dep[f]+1;
for(int i=1;1<<i<=dep[x];i++)
st[x][i]=st[st[x][i-1]][i-1];
for(int i=h[x];i;i=tr[i].u)
{
int v=e[i].v;
if(v!=f)
{
val[v]=tr[i].w;
st[v][0]=x;
dfs(v,x);
}
}
}
int lca(int a,int b)
{
if(find(a)!=find(b))
return -1;
if(find(a)!=find(b))
return -1;//两个节点不联通
if(dep[a]<dep[b])
swap(a,b);
while(dep[a]>dep[b])
{
int k=log2(dep[a]-dep[b]);
a=st[a][k];
}
if(a==b)
return a;
for(int i=log2(dep[a])+1;i>=0;i--)
{
if(st[a][i]==st[b][i])
{
a=st[a][i];
b=st[a][i];
}
}
return st[a][0];
}
void work(int x,int y)
{
int fa=lca(x,y);
if(fa==-1)
cout<<-1<<"\n";return;
int a,b;
a=b=0x3f3f3f3f;
for(int i=x;i!=fa;i=st[x][0])
a=min(a,val[i]);
for(int i=x;i!=fa;i=st[x][0])
b=min(b,val[i]);
cout<<min(a,b)<<"\n";
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>e[i].u>>e[i].v>>e[i].w;
kruskal();
cin>>q;
dep[1]=1;
for(int i=1;i<=n;i++)
{
if(find(i)==i)//i为树根
{
st[i][0]=i;
dfs(i,0);//因为可能有多棵树,所以for循环枚举一遍
}
}//初始化!!!
for(int i=1;i<=n;i++)
cout<<val[i]<<" ";
// while(q--)
// {
// int a,b;
// cin>>a>>b;
// work(a,b);//最小边一定在两点路径到lca上
// }
return 0;
}