题解 | #最小生成树#

最小生成树

https://www.nowcoder.com/practice/735a34ff4672498b95660f43b7fcd628

/**

  • 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
  • 返回最小的花费代价使得这n户人家连接起来
  • @param n int整型 n户人家的村庄
  • @param m int整型 m条路
  • @param cost int整型二维数组 一维3个参数,表示连接1个村庄到另外1个村庄的花费的代价
  • @param costRowLen int cost数组行数
  • @param costColLen int* cost数组列数
  • @return int整型 */ //普里姆算法 #include <stdlib.h> #include <limits.h> // For INT_MAX

int miniSpanningTree(int n, int m, int** cost, int costRowLen, int* costColLen) { int* homevexcost = malloc(n * sizeof(int)); // 存储到最近村庄的距离 int** edgecost = malloc(n * sizeof(int*)); // 邻接矩阵 int sumcost = 0; // 最小生成树的总成本

// 初始化邻接矩阵
for (int i = 0; i < n; i++) {
    edgecost[i] = malloc(n * sizeof(int));
    for (int j = 0; j < n; j++) {
        edgecost[i][j] = (i == j) ? 0 :
                         INT_MAX; // 对角线设为0,其余设为无穷大
    }
}

// 填充邻接矩阵
for (int i = 0; i < costRowLen; i++) {
    int u = cost[i][0] - 1;
    int v = cost[i][1] - 1;
    int w = cost[i][2];
    if (w < edgecost[u][v]) {
        edgecost[u][v] = w;
        edgecost[v][u] = w;
    } // 因为图是无向的
}

// 初始化第一个村庄的成本为0
homevexcost[0] = 0;
// 计算从第一个村庄出发到其他村庄的最短距离
for (int i = 0; i < n; i++) {
    homevexcost[i] = edgecost[0][i];
}

// 构建最小生成树
for (int i = 1; i < n; i++) {
    int mincost = INT_MAX;
    int l = -1;
    for (int j = 0; j < n; j++) {
        if (homevexcost[j] != 0 && homevexcost[j] < mincost) {
            mincost = homevexcost[j];
            l = j;
        }
    }

    // 更新已加入生成树的村庄集合,并累加当前边的成本到总成本中
    sumcost += mincost;
    homevexcost[l] = 0;

    // 更新从新加入的村庄出发到其他村庄的距离
    for (int a = 0; a < n; a++) {
        if (edgecost[l][a] < homevexcost[a]) {
            homevexcost[a] = edgecost[l][a];
        }
    }
}

// 释放内存并返回最小生成树的总成本
for (int i = 0; i < n; i++) {
    free(edgecost[i]);
}
free(edgecost);
free(homevexcost);

return sumcost;

}

#我的实习求职记录#
全部评论

相关推荐

08-11 17:48
辽宁大学 财务
投秋招已经快两周,每天就是投投投到厌倦然后躺床上刷痘印越刷越焦虑
驼瑞驰_招募评论官版...:你把牛客放中间,那你必得offer的
点赞 评论 收藏
分享
08-08 16:33
唐山学院 Java
职场水母:首先,简历太长,对于实习和应届找工作,hr一眼扫的是学历,技术看实习,你写的技术栈字太多了,尽量用一句话概括不用写那么详细,技术面的时候会问的,而且技术栈都会在实习或者项目里体现,你要做的是,把你的简历浓缩为一页,删除没用的东西,比如实践经历,自我评价,这些纯废话,没用,专业技能写的太离谱,你真的熟练掌握了吗,建议都写熟悉,找工作和写论文不一样,追求的是干练和实用,把实习经历和项目提前,把掌握的技术栈写到最后,然后去找实习,
点赞 评论 收藏
分享
积极的小学生不要香菜:你才沟通多少,没500不要说难
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务