图的最小生成树

#include<bits/stdc++.h>


int edge[1005][1005];//用邻接矩阵表示的图
int book[1005];//已确定的节点集合
int dis[1005];//最短路径
int shor[1005];//进入树的点的上一个点
int num=0;//节点的总个数


int prim(int s) {
    int pos, min;//pos记录每次确定下来要加入集合book的那个节点,min表示当前这轮确定的最短路径
    int MST = 0;//累加最短路径,表示最短路径和


    book[s] = 1;//首先,将节点s放入集合book
    pos = s;


    for (int i = 1; i <= num; i++) //初始化dis
        dis[i] = edge[pos][i];


    //执行n-1次
    for (int i = 2; i <= num; i++) {
        min = INT_MAX;


        for (int j = 1; j <= num; j++) {
            if (book[j]==0 && min > dis[j]) {
                min = dis[j];
                pos = j;
            }
        }
        book[pos] = 1;//确定选择出离当前节点最近的那个节点
        printf("%d -> %d\n",shor[pos],pos);
        MST += min;//加上这条最短路径


        for (int j = 1; j <= num; j++) //尝试更新dis
        if (book[j]==0 && dis[j] > edge[pos][j]){//更新条件:j点未访问,加入新点后已访问集合到j的距离变小了
            dis[j] = edge[pos][j];
            shor[j] = pos;    //记录进入树的点上一个最短点
        }
    }
    return MST;
}


int main() {
    int n;
    int i,m,j;
    while(~scanf("%d",&n)) {
        for(i=1;i<=n;i++) {
            book[i]=0;
            dis[i]=0;
            shor[i] = 1;
            for(j=1;j<=n;j++) {
                edge[i][j]=INT_MAX;
            }
        }


        num = n;
        printf("请输入几号到几号有边,权值是多少,以0 0 0结束\n");   //输入图
        while(scanf("%d %d %d",&i,&j,&m),i!=0){    //生成邻接矩阵
            edge[i][j] = edge[j][i] = m;
        }


        int ans = prim(1);     //特殊生成  只以1为根的生成
        printf("%d\n",ans);     


    }


    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值