为什么我建的最大生成树是错误的?
//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],vis[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+m+1,cmp);
init(n);
for(int i=1;i<=m;i++)
{
int fx=find(e[i].u);
int fy=find(e[i].v);
if(fx^fy)
{
par[fy]=par[fx];
add(e[i].u,e[i].v,e[i].w);
add(e[i].v,e[i].u,e[i].w);
}
}
return;
}
// 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];
// cout<<x<<" "<<f<<"\n";
// for(int i=h[x];i;i=tr[i].u)//树的边
// {
// int v=tr[i].v;
// if(v!=f && vis[v]==0)
// {
// val[v]=tr[i].w;
// st[v][0]=x;
// vis[v]=1;
// dfs(v,x);
// }
// }
// }
// int lca(int a,int b)
// {
// 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";
// else
// {
// 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();
for(int i=1;i<=cnt;i++)
{
for(int j=h[i];j;j=tr[j].u)
cout<<i<<" "<<j<<" "<<tr[i].v<<"\n";
cout<<"\n";
}
// cin>>q;
// for(int i=1;i<=n;i++)
// {
// if(find(i)==i)//i为树根
// {
// vis[i]=1;
// dep[i]=1;
// st[i][0]=i;
// dfs(i,i);//因为可能有多棵树,所以for循环枚举一遍
// cout<<i<<"\n";
// }
// }//初始化!!!
// for(int i=1;i<=n;i++)
// printf("ss %d %d\n",st[i][0],val[i]);
// cout<<"\n";
// while(q--)
// {
// int a,b;
// cin>>a>>b;
// work(a,b);//最小边一定在两点路径到lca上
// }
// return 0;
}/*
4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3
*/