Kruskal模板:按照边权排序,开始从最小边生成树

#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<iostream>
#define N 1000+5//n 个顶点,m条边
using namespace std;
//最小生成树模板(计算最小生成树的sum)
struct node
{
int u,v,len;//u->v距离len
}q[N];
int f[N],n,m;
int getf(int v)
{
if(f[v]==v)
return v;//找到祖先
return f[v]=getf(f[v]);//压缩路径
}
bool marge(int u,int v)
{
int t1=getf(u),t2=getf(v);
if(t1==t2)
return 0;//同一个祖先,已经连接过
f[t1]=t2;
return 1;
}
bool comp(node a,node b)
{
return a.len<b.len;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++)//初始化并查集数组
f[i]=i;//祖先是本身
for(int i=0;i<m;i++)
scanf("%d%d%d",&q[i].u,&q[i].v,&q[i].len);
sort(q,q+m,comp);//按照边的权值从小到大排序
int count=0,sum=0;
for(int i=0;i<m;i++)
{
if(count==n-1)//n个顶点 n-1条边
break;
if(marge(q[i].u,q[i].v))
{
count++;
sum+=q[i].len;
}
}
if(count==n-1)
printf("%d\n",sum);
else
printf("NO\n");
return 0;
}

Prim模板:找树顶点和非树顶点之间的最小边

1、邻接矩阵

//prim算法
#include<stdio.h>
#include<string.h>
#define N 100+5
int main()
{
int n,m,e[N][N],dis[N];
bool book[N];
scanf("%d%d",&n,&m);
memset(dis,0x3f3f3f3f,sizeof(dis));
memset(e,0x3f3f3f3f,sizeof(e));
memset(book,0,sizeof(book));
for(int i=0;i<N;i++)
e[i][i]=0;//邻接矩阵
int u,v,len;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&len);
e[v][u]=e[u][v]=len;
}
for(int i=1;i<=n;i++)
dis[i]=e[1][i];//初始化dis数组
/* prim核心 */
book[1]=1;//标记树顶点
int count=1,sum=0;//已经加入树的顶点
while(count<n)//知道顶点全部是树顶点
{
int minn=0x3f3f3f3f,j;
for(int i=1;i<=n;i++)//找到树顶点与非树顶点之间最短的边
{
if(dis[i]<minn&&!book[i])
j=i,minn=dis[i];
}
sum+=minn;
count++;
book[j]=1;
for(int i=1;i<=n;i++)//遍历更新树顶点和非树顶点之间的最短路径
{
if(!book[i]&&dis[i]>e[j][i])
dis[i]=e[j][i];
}
}
printf("%d\n",sum);
return 0;
}

2、邻接表

次小生成树:

当给我们求出最小生成树的时候,依次将不属于最小生成树的边(u,v)加入生成树中,此时形成一个环,找出这个环中除了(u,v)最大的边删除,得出的可能是次小生成树,列举所有边,求出次小值.

最小生成树不唯一:

输入边的时候记录一下权值相等的边,求最小生成树,判断边是否被标记,如果被标记,依次删除,看是否能生成最小生成树,如果可以,则最小生成树不唯一。poj - 1679

最小生成树(次小生成树)(最小生成树不唯一) 模板:Kruskal算法和 Prim算法的更多相关文章

  1. 最小生成树之Kruskal算法和Prim算法

    依据图的深度优先遍历和广度优先遍历,能够用最少的边连接全部的顶点,并且不会形成回路. 这样的连接全部顶点并且路径唯一的树型结构称为生成树或扩展树.实际中.希望产生的生成树的全部边的权值和最小,称之为最 ...

  2. 求最小生成树——Kruskal算法和Prim算法

    给定一个带权值的无向图,要求权值之和最小的生成树,常用的算法有Kruskal算法和Prim算法.这两个算法其实都是贪心思想的使用,但又能求出最优解.(代码借鉴http://blog.csdn.net/ ...

  3. 最小生成数kruskal算法和prim算法

    定义 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连通图. 连通网:在 ...

  4. 贪心算法-最小生成树Kruskal算法和Prim算法

    Kruskal算法: 不断地选择未被选中的边中权重最轻且不会形成环的一条. 简单的理解: 不停地循环,每一次都寻找两个顶点,这两个顶点不在同一个真子集里,且边上的权值最小. 把找到的这两个顶点联合起来 ...

  5. 最小生成树的两种方法(Kruskal算法和Prim算法)

    关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连 ...

  6. 训练指南 UVALive - 5713(最小生成树 + 次小生成树)

    layout: post title: 训练指南 UVALive - 5713(最小生成树 + 次小生成树) author: "luowentaoaa" catalog: true ...

  7. POJ 1679 The Unique MST 【最小生成树/次小生成树模板】

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22668   Accepted: 8038 D ...

  8. [ An Ac a Day ^_^ ] [kuangbin带你飞]专题八 生成树 UVA 10600 ACM Contest and Blackout 最小生成树+次小生成树

    题意就是求最小生成树和次小生成树 #include<cstdio> #include<iostream> #include<algorithm> #include& ...

  9. URAL 1416 Confidential (最小生成树+次小生成树)

    Description Zaphod Beeblebrox - President of the Imperial Galactic Government. And by chance he is a ...

随机推荐

  1. Python 十大语法

    前言 Python 是一种代表简单思想的语言,其语法相对简单,很容易上手.不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了.本文精心筛选了最能展现 Python 语法之精妙的十个知识 ...

  2. 编写简单i18n库

    i18n是什么?i18n(其来源是英文单词internationalization的首末字符i和n,18为中间的字符数)是"国际化"的简称. 前言 第一次接触多语言是用野生java ...

  3. MySQL的万字总结(缓存,索引,Explain,事务,redo日志等)

    hello,小伙伴们,好久不见,MySQL系列停更了差不多两个月了,也有小伙伴问我为啥不更了呢?其实我去看了MySQL的全集,准备憋个大招,更新篇长文(我不会告诉你是因为我懒的). 好了,话不多说,直 ...

  4. Git使用ssh公钥

    Git使用ssh公钥 一.  何谓公钥 1.很多服务器都是需要认证的,ssh认证是其中的一种.在客户端生成公钥,把生成的公钥添加到服务器,你以后连接服务器就不用每次都输入用户名和密码了. 2.很多gi ...

  5. 代号为 Kyria 的 Manjaro Linux 19.0 系统正式发布

    Xfce版本仍然是主打,此版本Xfce更新到4.14,并且主要致力于在桌面和窗口管理器上完善用户体验. KDE版本提供了功能强大.成熟且丰富的Plasma 5.17桌面环境,此版本进行了完全重新设计. ...

  6. 【Python】2.17学习笔记 移位运算符,逻辑运算符

    移位运算符 左移运算符 \(<<\),将对应的二进制数末尾补一颗零,高位自然溢出(遁入虚无 print( 5 << 2 ) 把\(5\)的二进制数左移两位 即把\(101\)变 ...

  7. XSS(跨站脚本攻击)详解

    跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往Web ...

  8. 【TIJ4】第五章全部习题

    第五章习题 5.1 package ex0501; //[5.1]创建一个类,它包含一个未初始化的String引用.验证该引用被Java初始化成null class TestDefaultNull { ...

  9. 使用C#+EmguCV处理图像入门(图像读取_显示_保存)二

    上个随笔已经介绍EmguCV的一些常用库和程序安装以及环境变量的配置,这次写的是如何使用这个类库对图像进行操作. EmguCV图像处理系统组成(个人见解): 图像的基本操作: 贴个代码: using ...

  10. 选择tomcat时候提示Project facet Java version 1.8 is not supported.解决办法

    是因为jdk版本不一致导致的,如何解决? 方法一: 选中项目Properties,选择Project Facets,右击选择Java,Change Version 方法二: 在项目的目录下有一个.se ...