kruskal算法可以计算生成几棵树。而prim算法不行。
算法参照:http://www.slyar.com/blog/kruskal-disjoint-sets-c.html
附上代码:
#include <iostream>
#include <algorithm>
using namespace std;
int f[100000];
struct tt
{
int a,b,c;
bool operator < (const tt &that) const
{
return c < that.c;
}
}g[100000];
void set(int t)
{
for(int i=1;i<=t;i++)
f[i]=i;
}
int fine(int x)
{
if(f[x]!=x)
f[x]=fine(f[x]);
return f[x];
}
int main()
{
int n,m,k,sum=0;
cin>>n>>m>>k;
int t=n;
set(n);
for(int i=1;i<=m;i++)
cin>>g[i].a>>g[i].b>>g[i].c;
sort(g+1,g+m+1);
for(int i=1;i<=m;i++)
{
if(t==k)
{
break;
}
int aa=fine(g[i].a); //Union
int bb=fine(g[i].b);
if(aa!=bb)
{
sum+=g[i].c;
f[bb]=aa;
t--;
}
}
if(t!=k)
cout<<"No Answer\n";
else
cout<<sum<<"\n";
return 0;
}