1、刚开始把从点1到每个能连同的点赋值给lowcost[?],然后用mst[1]储存是从1连接过去的。
2、然后找出这些lowcost的最小值,然后连接第一条边。
3、通过mst[[知道这条边是从1连接过去的,然后找这条边的另一个点,从这个点开始用map[][]找出其连的边中(如到5)是否比1到5小,
如果比1到5小,则替换lowcost[],mst,储存这个点.
4、然后再找一次最小的lowcost,然后连接这条边的两个点,反复到最后可以连完所有最小的lowcost,得到最小生成树.
the reason of first failure: for(j=0ij<n;j++) 注意i和j的使用,错了很多次。
代码:
#include<iostream>
#define maxn 9999
using namespace std;
int map[maxn][maxn];
int Prim(int map[][maxn],int n){
int lowcost[n+5],mst[n+5];
int i,j,min,sum=0,minid;
for(int i=2;i<=n;i++){
lowcost[i]=map[1][i];
mst[i]=1; //意思为到每个点的距离,目前都是从1出发
}
mst[1] = 0;
for(i=2;i<=n;i++){
min=maxn;
minid=0;
for(j=2;j<=n;j++){
if(lowcost[j]<min&&lowcost[j]!=0){
min=lowcost[j];
minid=j;}
}
cout << "点" << mst[minid] << "---" << minid << "的距离为" << min << endl;
sum+=min;
lowcost[minid]=0;
for(j=2;j<=n;j++){
if(map[minid][j]<lowcost[j]){
lowcost[j]=map[minid][j];
mst[j]=minid;
}
}
}
return sum;
}
int main(){
int a,b,c,d,i,j,k;
int n,m,sum;
int x,y,cost;
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
cin >> n >> m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=maxn;
for(i=0;i<m;i++){
cin >> x >> y >> cost;
map[x][y]=cost;
map[y][x]=cost;
}
sum=Prim(map,n);
cout << "权值的和为" << sum;
return 0;
}