最小生成树有很多种做法,大家应该都知道。
今天笔者专门为大家介绍两种做法:
代码比较丑,很久以前写的,不要见怪,在此博主致以强烈的抱歉。
方法一:邻接矩阵读入,prim算法处理
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n,map[101][101],d[101],ans=0;
bool f[101];
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&map[i][j]);
for(int i=2;i<=n;i++)
d[i]=1000000000;
memset(f,false,sizeof(f));
d[1]=0;
for(int i=1;i<=n;i++){
int min=2147483647,x;
for(int j=1;j<=n;j++)
if(!f[j] && d[j]<min){
min=d[j];
x=j;
}
ans+=min;
f[x]=true;
for(int j=1;j<=n;j++)
if(!f[j] && map[x][j]<d[j])
d[j]=map[x][j];
}
printf("%d\n",ans);
return 0;
}
方法二:邻接表读入,kruskal处理
#include<iostream>
using namespace std;
struct node{
int x,y,w;
};
struct node a[1000];
int f[1000];
int cha(int x){
while(f[x]!=x)
x=f[x];
return x;
}
int main(){
int i,j,k,m,n;
cin>>n>>m;
for(i=1;i<=m;i++)
cin>>a[i].x>>a[i].y>>a[i].w;
for(i=1;i<m;i++)
for(j=i+1;j<=m;j++)
if(a[i].w>a[j].w){
struct node tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
for(i=1;i<=n;i++)f[i]=i;
int ans=0,s=0;
for(i=1;i<=m;i++)
if(cha(a[i].x)!=cha(a[i].y)){
f[cha(a[i].x)]=cha(a[i].y);
s++;
ans+=a[i].w;
if(s>=n-1)break;
}
cout<<ans<<endl;
return 0;
}