/******************Kruskal********************/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int V = 101;
int father[V],map[V][V];
struct point
{
int s,v,rank;
}p[V*V];
int cmp(point a, point b)
{
return a.rank<b.rank;
}
int find(int x) //O(n)
{
if(x!=father[x])
father[x]=find(father[x]);
return father[x];
}
void Union(int a,int b) //O(n)
{
int x = find(a);
int y = find(b);
if(x==y) return ;
father[y]=x;
}
bool found(int n) //O(n)
{
int x=find(0);
for(int i=0;i<n;i++)
if(find(i)!=x)
return false;
return true;
}
int kruskal(int map[][V],int n) //O(n^3)?
{
int i,j,cnt,mst=0;
for(i=0,cnt=0;i<n;i++)
{
father[i]=i;
for(j=0;j<n;j++)
{
p[cnt].s=i;
p[cnt].v=j;
p[cnt].rank = map[i][j];
cnt++;
}
}
sort(p,p+n*n,cmp); //O(E*logE) E=n^2
for(i=0;i<n*n;i++)
{
if(p[i].rank!=0)
{
if(find(p[i].s)!=find(p[i].v))
mst+=p[i].rank;
Union(p[i].s,p[i].v);
if(found(n)==true)
return mst;
}
}
}
int main()
{
// freopen("in.txt","r",stdin);
int n;
scanf("%d",&n);
int m,i,j,p,q,cnt=0;
memset(map,0,sizeof(map));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&map[i][j]); // 输入一个邻接矩阵
cout<<kruskal(map,n)<<endl;
return 0;
}
调用函数时......map[][v]是邻接矩阵 , n是矩阵的宽度
下面是吉林大学的prim最小生成树模版...以前都是用这个的...也比较好用
/***********************Prim 求MST******************************/
const int inf = 0x3f3f3f3f;
int vis[V],lowc[V];
int prim(int cost[][V], int n) // vertex: 0 ~ n-1
{
int i, j, p,minc, res = 0;
memset(vis, 0, sizeof(vis));
vis[0] = 1;
for (i=1; i<n; i++)
lowc[i] = cost[0][i];
for (i=1; i<n; i++)
{
minc = inf; p = -1;
for (j=0; j<n; j++)
if (0 == vis[j] && minc > lowc[j])
minc = lowc[j]; p = j;
if (inf == minc) return -1; // 原图不连通
res += minc;
vis[p] = 1;
for (j=0; j<n; j++)
if (0 == vis[j] && lowc[j] > cost[p][j])
lowc[j] = cost[p][j];
}
return res;
}