prime
#include<iostream>
#include<cstring>
using namespace std;
int a[101][101];//矩阵表示图
int lowcost[101], closest[101];//初始都为0
int Prim(int n)
{
int i, j, k, temp, min;//temp记录每个过程中加入集合V的点,min记录每个过程中加入的边长
int sum=0 ;
for(i=0; i<n; i++)
{
lowcost[i]=a[0][i];
closest[i]=0;
}
for(i=1; i<n; i++)
{
min=99999;
for(j=0; j<n; j++)//在V-U中找出离U最近的顶点temp
{
if(lowcost[j] && min>lowcost[j])
{
min=lowcost[j];
temp=j;
}
}
lowcost[temp]=0;//标记temp已加入U
sum+=min;
for(j=0; j<n; j++)//更新 lowcost, closest;
if(a[temp][j]!=0 && a[temp][j]<lowcost[j])
{
lowcost[j]=a[temp][j];
closest[j]=k;
}
}
return sum;
}
int main()
{
int n;
int i, j;
while( cin>>n )
{
for(i=0; i<n; i++)
for(j=0; j<n; j++)
cin>>a[i][j];
cout<<Prim(n)<<endl;
}
}
Kruskal
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct Edge
{
int start;//边的起点
int end;//边的中点
int weight;//边的权值
}edge[10000];
int a[101][101];//矩阵表示图
int parent[101], num[101];
void Make(int n)
{
int i;
for(i=0; i<n; i++)
{
parent[i]=i;
// num[i]=1;
}
}
int Find(int x)
{
if( parent[x]==x)
return x;
parent[x]=Find( parent[x]);//路径压缩
}
void Union(int i, int j)
{
int x, y;
x=Find(i);
y=Find(j);
if(x!=y)
{
parent[y]=x;
// num[x]+=num[y];
}
}
int Kruskal(int n)
{
int i, number;
int start1, end1;
int sum=0;
Make(n);//初始化并查集
number=1;
for(i=0; number<n; i++)
{
start1=edge[i].start;
end1=edge[i].end;
if( Find(start1)!=Find(end1) )
{
sum+=edge[i].weight;
number++;
Union(start1, end1);
}
}
return sum;
}
int cmp(struct Edge a, struct Edge b)
{
return a.weight<b.weight;
}
int main()
{
int n;
int i, j, k;
while( cin>>n )
{
k=0;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
{
cin>>a[i][j];
if( a[i][j]!=0 )
{
edge[k].start=i;
edge[k].end=j;
edge[k].weight=a[i][j];
k++;
}
}
sort(edge, edge+k, cmp);
cout<<Kruskal(n)<<endl;
}
}