kruskal算法模版:
#include<iostream>
#include<cmath>
#include<string.h>
#include<algorithm>
#include<stdio.h>
using namespace std;
int n,ne;//n是点的个数,ne是边的个数
struct edge
{
int u,v,w;
};
const int node_size=110;
edge e[node_size*node_size];
int fa[node_size];
void init()
{
for(int i=0; i<node_size; i++)
{
fa[i]=i;
}
}
int find(int u)
{
if(fa[u]==u)
return u;
else
return fa[u]=find(fa[u]);
}
bool join(int u,int v)
{
if(find(u)!=find(v))//没有共同祖先,说明没有形成回路
{
fa[find(u)]=find(v);//将节点纳入最小生成树集合
return true;
}
else
return false;
}
bool cmp(edge a,edge b)
{
return a.w<b.w;
}
int kruskal()
{
init();
int edge_num=0;
int sum=0;
sort(e,e+ne,cmp); //将边按升序排序
for(int i=0; i<ne; i++)
{
//如果加入的边不会使树形成回路
if(join(e[i].u,e[i].v))
{
sum+=e[i].w;
edge_num++;
}
//如果纳入的边数等于顶点数-1,则说明最小生成树形成
if(edge_num==n-1)break;
}
return sum;
}
int main()
{
while(cin>>n)
{
ne=0;
int a;
memset(e,0,sizeof(e));
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
cin>>a;
if(i != j)
{
e[ne].u=i;
e[ne].v=j;
e[ne].w=a;
ne++;
}
}
}
cout<<kruskal()<<endl;
}
return 0;
}