Kruskal-最小生成数
Kruskal-最小生成数
Kruskal算法
getf是找祖宗的函数。这里edge用的是结构体,我数组也做过,但是代码有点乱,不采用。代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int f[1000];
int tot=0;
int k=0;
struct node
{<!-- -->
int st;
int en;
int di;
}edge[1000];
bool cmp(node x,node y)
{<!-- -->
return x.di<y.di;
}
int getf(int k)
{<!-- -->
if (f[k]==k)
{<!-- -->
return k;
}
else
{<!-- -->
f[k]=getf(f[k]);
return f[k];
}
}
void unionn(int x,int y)
{<!-- -->
f[getf(y)]=getf(x);
}
int main()
{<!-- -->
int n,m;
cin>>n>>m;
for (int i=1;i<=m;i++)
{<!-- -->
cin>>edge[i].st>>edge[i].en>>edge[i].di;
}
for (int i=1;i<=n;i++)
{<!-- -->
f[i]=i;
}
sort(edge+1,edge+m+1,cmp);
for (int i=1;i<=m;i++)
{<!-- -->
if (k==n-1)
{<!-- -->
break;
}
if (getf(edge[i].st)!=getf(edge[i].en))
{<!-- -->
unionn(edge[i].st,edge[i].en);
tot+=edge[i].di;
k++;
}
}
cout<<tot<<endl;
return 0;
}
点个赞再走呗~~~o( ̄▽ ̄)ブ</em>
转载于网络 侵权联系作者立即删除QAQ

浙公网安备 33010602011771号