搜索与图论:Prim

Prim算法求最小生成树:

每次将离连通部分的最近的点和点对应的边加入的连通部分,连通部分逐渐扩大,最后将整个图连通起来,并且边长之和最小。

cpp 复制代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 510;

int g[N][N];//存储图
int dist[N];//存储各个节点到生成树的距离
bool st[N];//节点是否被加入到生成树中
int pre[N];//节点的前驱节点,用于输出各个边时需要,该题不需要
int n, m;//n 个节点,m 条边

void prim()
{
    memset(dist,0x3f3f3f3f, sizeof dist);//初始化距离数组为一个很大的数(10亿左右)
    int res= 0;
    dist[1] = 0;//从 1 号节点开始生成 
    for(int i = 0; i < n; i++)//每次循环选出一个点加入到生成树
    {
        int t = -1;
        for(int j = 1; j <= n; j++)//每个节点一次判断,直到遍历完全部的点,找到未在生成树的点的最小距离点
        {
            if(!st[j] && (t == -1 || dist[j] < dist[t]))//如果没有在树中,且到树的距离最短,则选择该点
                t = j;
        }

        //如果孤立点,直返输出不能,然后退出
        if(dist[t] == 0x3f3f3f3f)
        {
            printf("impossible\n");
            return;
        }

        st[t] = 1;// 选择该点
        res += dist[t];//生成树总长度加该点的长度,就是新的总长度
        for(int i = 1; i <= n; i++)//更新生成树外的点到生成树的距离
        {
            //从 t 到节点 i 的距离小于原来距离,则更新。
            //因为以前i的距离是到树的某个点的距离,现在树加入了t节点,所以判断是否i跟t更近是则更新i到树的距离,!st是判断是否是树外的点
            if(dist[i] > g[t][i] && !st[i])
            {
                dist[i] = g[t][i];//更新距离
                pre[i] = t;//从 t 到 i 的距离更短,i 的前驱变为 t.
            }
        }
    }
    printf("%d\n",res);
    return;
}

void getPath()//输出各个边,该题不需要
{
    for(int i = n; i > 1; i--)//n 个节点,所以有 n-1 条边。

    {
        printf("%d %d\n",i,pre[i]);// i 是节点编号,pre[i] 是 i 节点的前驱节点。他们构成一条边。
    }
}

int main()
{
    memset(g, 0x3f3f3f3f, sizeof(g));//各个点之间的距离初始化成很大的数
    scanf("%d%d",&n,&m);//输入节点数和边数
    while(m --)
    {
        int a, b, w;
        scanf("%d%d%d",&a,&b,&w);//输入边的两个顶点和权重
        g[a][b] = g[b][a] = min(g[a][b],w);//存储权重,因为是无向图,所以ab和ba都要赋值
    }

    prim();//求最小生成树
    return 0;
}
相关推荐
云小逸27 分钟前
【Nmap 设备类型识别技术】整体概况
服务器·c语言·网络·c++·nmap
梯度下降中27 分钟前
求职面试中的线代知识总结
人工智能·线性代数·算法·机器学习
SmartBrain38 分钟前
OCR 模型在医疗场景的选型研究
人工智能·算法·语言模型·架构·aigc·ocr
梵刹古音39 分钟前
【C语言】 跳转语句
c语言·开发语言·算法
liu****1 小时前
29.路径类dp
c++·算法·acm
JMchen1231 小时前
Android计算摄影实战:多帧合成、HDR+与夜景算法深度剖析
android·经验分享·数码相机·算法·移动开发·android-studio
阿猿收手吧!1 小时前
【C++】C++模板特化:精准定制泛型逻辑
开发语言·c++·算法
智驱力人工智能1 小时前
货车走快车道检测 高速公路安全治理的工程实践与价值闭环 高速公路货车占用小客车道抓拍系统 城市快速路货车违规占道AI识别
人工智能·opencv·算法·安全·yolo·目标检测·边缘计算
喵手1 小时前
Python爬虫实战:电商实体消歧完整实战 - 从混乱店铺名到标准化知识库的工程化实现,一文带你搞定!
爬虫·python·算法·爬虫实战·零基础python爬虫教学·同名实体消除·从混乱店铺名到标准化知识库
C语言小火车1 小时前
Qt样式实现方式详解:六大方法全面解析
c语言·c++·qt·学习