最小生成树(次小生成树)(最小生成树不唯一) 模板:Kruskal算法和 Prim算法
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算法的更多相关文章
- 最小生成树之Kruskal算法和Prim算法
依据图的深度优先遍历和广度优先遍历,能够用最少的边连接全部的顶点,并且不会形成回路. 这样的连接全部顶点并且路径唯一的树型结构称为生成树或扩展树.实际中.希望产生的生成树的全部边的权值和最小,称之为最 ...
- 求最小生成树——Kruskal算法和Prim算法
给定一个带权值的无向图,要求权值之和最小的生成树,常用的算法有Kruskal算法和Prim算法.这两个算法其实都是贪心思想的使用,但又能求出最优解.(代码借鉴http://blog.csdn.net/ ...
- 最小生成数kruskal算法和prim算法
定义 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连通图. 连通网:在 ...
- 贪心算法-最小生成树Kruskal算法和Prim算法
Kruskal算法: 不断地选择未被选中的边中权重最轻且不会形成环的一条. 简单的理解: 不停地循环,每一次都寻找两个顶点,这两个顶点不在同一个真子集里,且边上的权值最小. 把找到的这两个顶点联合起来 ...
- 最小生成树的两种方法(Kruskal算法和Prim算法)
关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连 ...
- 训练指南 UVALive - 5713(最小生成树 + 次小生成树)
layout: post title: 训练指南 UVALive - 5713(最小生成树 + 次小生成树) author: "luowentaoaa" catalog: true ...
- POJ 1679 The Unique MST 【最小生成树/次小生成树模板】
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 22668 Accepted: 8038 D ...
- [ An Ac a Day ^_^ ] [kuangbin带你飞]专题八 生成树 UVA 10600 ACM Contest and Blackout 最小生成树+次小生成树
题意就是求最小生成树和次小生成树 #include<cstdio> #include<iostream> #include<algorithm> #include& ...
- URAL 1416 Confidential (最小生成树+次小生成树)
Description Zaphod Beeblebrox - President of the Imperial Galactic Government. And by chance he is a ...
随机推荐
- JUC常用同步工具类——CountDownLatch,CyclicBarrier,Semaphore
在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别. 一.CountDownLa ...
- mysql in与exists区别
1.exists是对外表做loop循环,每次loop循环再对内表(子查询)进行查询,那么因为对内表的查询使用的索引(内表效率高,故可用大表),而外表有多大都需要遍历,不可避免(尽量用小表),故内表大的 ...
- 支持IE6、IE7、IE8等低端浏览器的简化版vue
最近研究Vue的底层原理,写了一个简化版的Vue,可以在支持IE6.IE7.IE8等低端浏览器运行.由于低端浏览器不支持对象属性定义,所以设置属性不支持直接赋值,需要调用虚拟机实例的set方法.目前只 ...
- leetcode 249 250 set和map的简单用法
leetcode249,利用了STL中的set class Solution { public: vector<int> intersection(vector<int>&am ...
- Redis系列二 - 数据结构
前言 redis作为我们开发的一大神器,我们接触肯定不会少,但是很多同学也许只会存储String类型的值,这是非常不合理的.在这里,将带大家认识Redis的5中数据结构. 1.问:Redis有那些数据 ...
- cocos2d-x android 入门
前一段时间使用传统方式做了一个CS软件,发现 UI 显示的比较慢,突发奇起,开始研究起来 GPU 加速,最后开始学习 cocos2dx. 开发环境以最新的 Cocos2d-x 3.17.1 Andro ...
- Flink系列之1.10版流式SQL应用
随着Flink 1.10的发布,对SQL的支持也非常强大.Flink 还提供了 MySql, Hive,ES, Kafka等连接器Connector,所以使用起来非常方便. 接下来咱们针对构建流式SQ ...
- Simulink仿真入门到精通(十七) Simulink代码生成技术详解
17.1 基于模型的设计 基于模型设计是一种流程,较之传统软件开发流程而言,使开发者能够更快捷.更高效地进行开发.适用范围包括汽车电子信号处理.控制系统.通信行业和半导体行业. V字模型开发流程整体描 ...
- 前后端分离基于Oauth2的SSO单点登录怎样做?
一.说明 单点登录顾名思义就是在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统,免除多次登录的烦恼:本文主要介绍跨域间的 前后端分离 项目怎样实现单点登录,并且与 非前后端分离 的差 ...
- synchronized实现原理及其优化-(自旋锁,偏向锁,轻量锁,重量锁)
1.synchronized概述: synchronized修饰的方法或代码块相当于并发中的临界区,即在同一时刻jvm只允许一个线程进入执行.synchronized是通过锁机制实现同一时刻只允许一个 ...