Prim算法

算法步骤

S:当前已经在联通块中的所有点的集合
1. dist[i] = inf
2. for n 次
t<-S外离S最近的点
利用t更新S外点到S的距离
st[t] = true
n次迭代之后所有点都已加入到S中
联系:Dijkstra算法是更新到起始点的距离,Prim是更新到集合S的距离

算法复杂度

O(n2

代码

题目:https://www.acwing.com/problem/content/description/860/

#include<bits/stdc++.h>
using namespace std; const int N=550,INF=0x3f3f3f3f;
int n,m;
int dist[N];
int g[N][N];
bool st[N]; int prim()
{
int ans=0;
memset(dist,0x3f,sizeof(dist));
int i,j;
for(i=0;i<n;i++)
{
int t=-1;
for(j=1;j<=n;j++)
{
if(!st[j]&&(t==-1||dist[t]>dist[j]))
t=j;
}
//如果不是第一个点,并且距离为INF,代表不联通
if(i&&dist[t]==INF)
return INF;
//非第一个点,且联通,将点加入,一定要先加入后更新
if(i)
ans+=dist[t];
//如果先更新,则会出现g[t][t]小于dist[j],会出现自环
for(j=1;j<=n;j++)
dist[j]=min(dist[j],g[t][j]);
//标记到集合
st[t]=true;
}
return ans;
} int main()
{
int i,j;
cin>>n>>m;
//初始化两点距离
memset(g,0x3f,sizeof(g));
while(m--)
{
int u,v,w;
cin>>u>>v>>w;
g[u][v]=g[v][u]=min(g[u][v],w);
}
int t=prim();
if(t==INF)
puts("impossible");
else
cout<<t;
return 0;
}

Kruskal算法

算法步骤

代码

题目:https://www.acwing.com/problem/content/description/861/

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,m;
int p[N]; struct node
{
int u,v,w;
bool operator< (const node &W)const
{
return w<W.w;
}
}edges[N]; int find(int x)
{
if(p[x]!=x)
p[x]=find(p[x]);
return p[x];
} int main()
{
int i,j;
cin>>n>>m;
for(i=0;i<m;i++)
{
int u,v,w;
cin>>u>>v>>w;
edges[i]={u,v,w};
}
//排序
sort(edges,edges+m);
//初始化
for(i=0;i<n;i++)
p[i]=i;
//记录边权值和,边数
int cnt=0;
int ans=0;
for(i=0;i<m;i++)
{
int u,v,w;
u=edges[i].u,v=edges[i].v,w=edges[i].w;
//找到对应的祖先
int a=find(u);
int b=find(v);
//若不在一个集合,就归入
if(a!=b)
{
ans+=w;
cnt++;
//指定的是u,v的祖先,归一
p[a]=b;
}
}
//若不为n-1条边,则代表不联通
if(cnt<n-1)
cout<<"impossible";
else
cout<<ans;
return 0;
}

最小生成树-Prim&Kruskal的更多相关文章

  1. 最小生成树 Prim Kruskal

    layout: post title: 最小生成树 Prim Kruskal date: 2017-04-29 tag: 数据结构和算法 --- 目录 TOC {:toc} 最小生成树Minimum ...

  2. 邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)

    matrix.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include < ...

  3. 数据结构学习笔记05图(最小生成树 Prim Kruskal)

    最小生成树Minimum Spanning Tree 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 树: 无回路   |V|个顶 ...

  4. 布线问题 最小生成树 prim + kruskal

    1 : 第一种 prime     首先确定一个点 作为已经确定的集合 , 然后以这个点为中心 , 向没有被收录的点 , 找最短距离( 到已经确定的点 ) , 找一个已知长度的最小长度的 边 加到 s ...

  5. POJ 1258 Agri-Net(最小生成树 Prim+Kruskal)

    题目链接: 传送门 Agri-Net Time Limit: 1000MS     Memory Limit: 10000K Description Farmer John has been elec ...

  6. 邻接表c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)

    graph.c #include <stdio.h> #include <stdlib.h> #include <limits.h> #include " ...

  7. poj1861 最小生成树 prim &amp; kruskal

    // poj1861 最小生成树 prim & kruskal // // 一个水题,为的仅仅是回味一下模板.日后好有个照顾不是 #include <cstdio> #includ ...

  8. 最小生成树---Prim算法和Kruskal算法

    Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...

  9. 最小生成树(prim&kruskal)

    最近都是图,为了防止几次记不住,先把自己理解的写下来,有问题继续改.先把算法过程记下来: prime算法:                  原始的加权连通图——————D被选作起点,选与之相连的权值 ...

随机推荐

  1. Redis学习之路(四)Redis-cluster java api操作

    import redis.clients.jedis.HostAndPort;import redis.clients.jedis.JedisCluster;import java.util.Hash ...

  2. Let’s Encrypt 通配符证书,泛域名证书申请配置

    首先你可以查看下官方提供的支持申请通配符证书的客户端列表:https://letsencrypt.org/docs/client-options/. 参考链接:https://github.com/N ...

  3. Tensorflow创建已知分布的张量

    一.随机数 tf.random(num) 随机产生返回0----num-1的数 二.图变量 tf.Variable.init(initial_value, trainable=True, collec ...

  4. Dota游戏匹配的所有组合

    在Dota游戏中有一种匹配玩法,任意5人以下玩家组队,加入匹配系统,由系统组合出5人 vs 5人的组合进行游戏,比如2人+3人  vs 1人+4人.抽象出这个问题,就变成两边各有m个玩家,最多允许n个 ...

  5. 解决surfacebook无法运行64位虚拟机的问题

    如果您嫌烦请直接看英文部分解决方案,另外windows专业版内置的hyper-v也是一款及其好用的虚拟机. 网上各种方案都尝试过,但是每次使用VMware创建64为虚拟机的时候总会显示不支持64位虚拟 ...

  6. win10中安装Linux子系统

    前言 Win10的Linux子系统闻名已久,今天就来操作一下 正文 限制 该功能是win10 1809 及之后才加入的功能,故请先核对版本. 开启功能 打开windows设置 设置 -> 更新和 ...

  7. 010_MySQL

    目录 初识MySQL 为什么学习数据库 什么是数据库 数据库分类 MySQL简介 Windows安装MySQL 安装建议 软件下载 安装步骤 安装SQLyog 下载安装 连接数据库 简单操作 命令行连 ...

  8. 【C++】《C++ Primer 》第十五章

    第十五章 面向对象程序设计 一.OOP:概述 面向对象程序设计(OOP)的核心思想是数据抽象.继承和动态绑定. 通过使用数据抽象,可以将类的接口和实现分离. 使用继承,可以定义相似的类型并对其相似关系 ...

  9. 【C++】《C++ Primer 》第五章

    第五章 语句 一.简单语句 表达式语句:一个表达式末尾加上分号,就变成了表达式语句. 空语句:只有一个单独的分号,记得注释说明提高代码可读性. 复合语句(块):用花括号 {}包裹起来的语句和声明的序列 ...

  10. 【Linux】删除软连接被坑

    ------------------------------------------------------------------------------------------------- | ...