代码随想录算法训练营第五十七天|图论part7

prim算法精讲

普利姆算法用于求最小生成树

三步:

1.选择离树最近的点

2.该点加入树

3.更新距离表

cpp 复制代码
#include <iostream>
#include <vector>
#include <climits>
using namespace std;


int main(){
    int v,e;
    cin>>v>>e;
    vector<vector<int>>grid(v+1,vector<int>(v+1,10001));
    for(int i=0;i<e;i++){
        int v1,v2,val;
        cin>>v1>>v2>>val;
        grid[v1][v2]=val;
        grid[v2][v1]=val;
    }
    vector<int>minDist(v+1,10001);
    vector<bool>isInTree(v+1,false);
    for(int j=1;j<v;j++){
        //第一步选取距离最小的点
        int min=INT_MAX;   
        int cur;
        for(int i=1;i<=v;i++){    
            if(!isInTree[i]&&minDist[i]<min){
                
                min=minDist[i];
                cur=i;
            }
        }
        //当前节点加入集合
        isInTree[cur]=true;
        //更新当前minDist
        for(int i=1;i<=v;i++){
            if(!isInTree[i]&&grid[cur][i]<minDist[i]){
                minDist[i]=grid[cur][i];
            }
        }
    }
    int ans=0;
    for(int i=2;i<=v;i++){
        ans+=minDist[i];
    }
    cout<<ans;

}

注意!!!vector<vector<int>>grid(v+1,vector<int>(v+1,10001));

这一行很重要

不能初始化为0 这样不存在的边的权值为0 ,应该把不存在的边的权值设为最大值!!!!!!!

kruskal算法精讲

lambda表达式:

一句话:

"一次性、匿名、可调用对象 ",本质上编译器帮你生成一个未命名的函数对象类(closure type)。

"方括号抓变量,圆括号写参数,箭头指返回,花括号干正事。"

capture ( parameter_list ) { body }

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n=10000;
struct edge{
    int v1,v2,val;
    edge(int _v1,int _v2,int _val):v1(_v1),v2(_v2),val(_val){}
};
vector<int>father(n+1,0);

void init(){
    for(int i=0;i<father.size();i++){
        father[i]=i;
    }
};
int find(int x){
    if(father[x]==x)return x;
    else return father[x]=find(father[x]);
}

bool isSame(int x,int y){
    x=find(x);
    y=find(y);
    return x==y;
}

void join(int u, int v){
    u=find(u);
    v=find(v);
    if(u==v) return ;
    father[v]=u;
}


int main(){
    //数据读取
    int v,e;
    cin>>v>>e;
    vector<edge>edges;
    for(int i=0;i<e;i++){
        int v1,v2,val;
        cin>>v1>>v2>>val;
        edges.push_back(edge(v1,v2,val));
    }
    //排序
    sort(edges.begin(),edges.end(),[](edge &a,edge &b){
        return a.val<b.val;
    });
    int ans=0;
    init();
    //贪心选择
    for(auto _e:edges){
        int l=_e.v1;
        int r=_e.v2;
        int val=_e.val;
        if(isSame(l,r)){   //不是同一个集合的
            continue;
        }else{
            join(l,r);
            ans+=val;
        }
    }
    cout<<ans;
}
相关推荐
Fa_Mian_Tuan2 天前
图论基础|邻接矩阵超详细讲解(含无向/有向/带权图+完整可运行C语言代码)
c语言·数据结构·笔记·算法·图论
有点。3 天前
C++二叉树二(练习题)
数据结构·c++·算法·图论
依然鸣4 天前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论
oier_Asad.Chen5 天前
【洛谷题解/AcWing题解/OI学习笔记】洛谷P2868【USACO07DEC】Sightseeing Cows G(01分数规划求最大比率)
算法·图论·spfa·二分·负环
wabs6665 天前
关于图论【A*算法 | 卡码网127.骑士的攻击的思考】
数据结构·算法·图论·卡码网·广搜的改进版
依然鸣6 天前
PTA团体程序设计天梯赛L2真题讲解L2-005-008
开发语言·数据结构·c++·算法·深度优先·pat考试·图论
wabs6667 天前
关于图论【最短路径之Bellman_ford 算法(单源有限最短路)|卡码网96.城市间货物运输III的思考】
数据结构·算法·图论·卡码网·bellman_ford·单源有限最短路
wabs6668 天前
关于图论【最短路径之Bellman_ford 算法(判断负权回路)|卡码网95.城市间货物运输II的思考】
数据结构·算法·图论·bellman_ford算法·卡码网·判断负权回路
cpp_25019 天前
P1113 [USACO02FEB] 杂务
数据结构·c++·算法·动态规划·图论·拓扑排序·洛谷题解
漂流瓶jz9 天前
UVA-12174 Shuffle的播放记录 题解答案代码 算法竞赛入门经典第二版
数据结构·c++·算法·图论·滑动窗口·算法竞赛入门经典·uva