首页 > 编程语言 >prim算法求最小生成树

prim算法求最小生成树

时间:2024-08-01 16:41:10浏览次数:17  
标签:dist int 最小 生成 算法 集合 prim inf

prim算法求最小生成树

#include<bits/stdc++.h>
using namespace std;
const int N=600;
int g[N][N];//n的平方约等于m,所以用邻接矩阵,存放权值。g[i][j]表示边ij的长度为g[i][j]
const int inf=0x3f3f3f3f;//无穷大0x3f3f3f3f
int dist[N];//该点到集合里点的最小值
bool st[N];//是否在已经选中的集合里,true表示在集合里 
int m,n;//n个顶点,m条边
int prim(){
    memset(dist,0x3f,sizeof dist);
    int res=0;
    for(int i=0;i<n;i++){//n轮循环把n个点按prim算法依次放入集合里
        int t=-1;
        for(int j=1;j<=n;j++){
            if(!st[j]&&(t==-1||dist[t]>dist[j])){//t为当前到集合的最小值。条件是这个点没访问过并且(这个当前j这个点如果是第一个点(t=-1)或者是能缩短当前已经找到最近点距离)
            
            t=j;
                
            }
        }
        if(i&&dist[t]==inf){//i不是第一个点,因为第一个点一定要放进。这个表达式是说连通不了返回无穷大。
            return inf;
        }
        //先加再更新dist,因为防止自环,自环是不能在生成树里因为假设有个自环g[t][t]=-6要是先更新dist会更新dist[t]生成树里会加上g[t][t]=-6这条环!
        if(i){//不是第一个点且连通-->更新最小生成树权重和
           res=res+dist[t];
        }
         st[t]=true;//t这个点放入集合
        for(int j=1;j<=n;j++ ){//用t这个点更新集合外各各点到集合内点的距离,因为t放入集合就要考虑t这个点与集合外各点距离能否更新最小值到集合内距离
            dist[j]=min(dist[j],g[t][j]);
        }
        
    }
    return res;
}
int main(){

    cin>>n>>m;
    memset(g,0x3f,sizeof g);
    int u,v,w;
    while(m--){
        cin>>u>>v>>w;
        g[u][v]=g[v][u]=min(w,g[u][v]);//无向图,两个方向权值一样,为了防止有重边所以要取最小
    }
    int t=prim();
    if(t==inf){
        cout<<"impossible";
    }
    else{
        cout<<t;
    }
    
    return 0;
}

 

标签:dist,int,最小,生成,算法,集合,prim,inf
From: https://www.cnblogs.com/luckyhappyyaoyao/p/18335896

相关文章

  • 克鲁斯卡尔算法
    克鲁斯卡尔算法稀疏图-->用克鲁斯卡尔算法克鲁斯卡尔算法套路:首先存放每条边用struct然后按照权值从小到大排序然后如果这条边的两个端点已经在一个连通块就不要把这条边放进来(因为生成树不能有闭合回路)如已经有边12,边13不能再放入边23判断连通块用find函数利用并查集算法......
  • 刀具磨损预测工器具磨损预测-RIME-CNN-SVM霜冰算法优化-完整代码数据
    直接看项目演示:刀具磨损预测工器具磨损预测-RIME-CNN-SVM霜冰算法优化_哔哩哔哩_bilibili效果演示:代码: importnumpyasnpimporttorchimporttorch.nnasnnimporttorch.nn.functionalasFimporttorch.optimasoptimfromtorch.utils.dataimportDataLoad......
  • 代码随想录算法训练营第56天 | 广搜和深搜应用
    110.字符串接龙https://kamacoder.com/problempage.php?pid=1183代码随想录https://www.programmercarl.com/kamacoder/0110.字符串接龙.html#思路105.有向图的完全可达性https://kamacoder.com/problempage.php?pid=1177代码随想录https://www.programmercarl.com/kamaco......
  • Day 30 贪心算法 Part04
    452.用最少数量的箭引爆气球自己写没写出来,不过找到篇很好的题解,贪心想不到就是想不到,没办法。本以为自己的思路也是贪心,但就是做不出来。classSolution{publicintfindMinArrowShots(int[][]points){boolean[]visited=newboolean[points.length];......
  • 用selenium打开网页的最小模板
    前言环境:win10python3.10selenium4.12经常用selenium来实现一个打开网页的这样一个小功能,虽然代码很少,但每次重0开始写就很烦。所以这里记录下一个模板小模板importtimefromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.web......
  • 代码随想录算法训练营day01|704. 二分查找,27. 移除元素,977.有序数组的平方
    704.二分查找题目链接:https://leetcode.cn/problems/binary-search/description/本人代码:classSolution{public:intsearch(vector<int>&nums,inttarget){intlow=0,high=nums.size()-1;//此处分情况讨论returnsearchTarget(nums,low,high,tar......
  • 基于模仿学习的自动泊车运动规划算法
    基于模仿学习的自动泊车运动规划算法本文使用ResNet+BERT分类模型来实现APA自动泊车算法附赠自动驾驶最全的学习资料和量产经验:链接首先定义模型的输出动作类别类别名说明S0停车S+直行前进单位距离S-直行后退单位距离L+左转前进单位角度L-左转后退单位角度R+右转前进......
  • 排序算法总结
    排序算法是数据结构与算法中的一个重要部分,用于对一组数据按照特定顺序进行排列。常见的排序算法有很多,每种算法都有其独特的时间复杂度、空间复杂度和稳定性等特性。以下是一些常用的排序算法及其特点:冒泡排序(BubbleSort):时间复杂度:平均情况下为 O(n2)O(n2),最坏情况下也是......
  • 【基础算法】前缀和和差分
    前缀和和差分前缀和一维前缀和二维前缀和差分一维差分二维差分前缀和前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,而差分可以看成前缀和的逆运算。合理的使用前缀和与差分,可以将某些复杂的问题简单化。一维前缀和前缀和算法有什么好处呢?先了......
  • 常见的排序算法(Java实现)
      一、冒泡排序      相邻的两个元素比较,大的放右边,小的放左边。二、选择排序   从0索引开始,把每一个索引依次跟后面的索引比较,大的放后面,小的放前面三、插入排序  将数组分为有序和无须两种,遍历数组将无须的数组插入有序的数组当中四、快......