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. 参考C# 使用 System.Web.Script.Serialization 解析 JSON

    参考C# 使用 System.Web.Script.Serialization 解析 JSON 使用json需要引用到System.Web.Script.Serialization.习惯在解决方案右键 ...

  2. linux同步当前网络时间

    [root@root ~]# yum install -y ntpdate 执行:ntpdate[root@root ~]# ntpdate 120.24.81.91或[root@root ~]# n ...

  3. Slog27_支配vue框架初阶项目之博客网站-样式居中

    ArthurSlog SLog-27 Year·1 Guangzhou·China July 30th 2018 GitHub 掘金主页 简书主页 segmentfault 没有写够足够的代码量,想成 ...

  4. Git建立本地分支和远程分支的映射关系

    git branch -vv:查看本地分支和远程分支的映射关系 在切换分支前,须本地建立新分支,例如:git branch release/v1.1   //本地建立release/v1.1分支成功后 ...

  5. Node.Js的热更新服务——supervisor

    因为目前项目每次修改文件要看效果,必须重启服务:node app.js再进入浏览器看效果,很是麻烦.所幸的是有很多第三方的管理工具(supervisor,hotnode,forever,pm2等),当 ...

  6. deepin15.11安装N卡驱动,实测!!!(可解决N卡电脑关机卡屏)

    前言:deepin(深度)是一款由武汉深之度公司研发的一款适合国人日常学习的linux系统,其UI精美,美过Mac.它对于中国用户的一个亮点就是QQ微信等国软件傻瓜式安装(类似安卓应用商店安装),如果 ...

  7. 脚本写一行echo也能写出bug ? glob了解一下

    背景 最近处理一个 bug 很有意思,有客户反馈某个配置文件解析失败了,出错的那行的内容就只有一个字母 a. 最开始以为是谁改动了处理的脚本,但要到了问题代码中的脚本,比较发现跟库上是一样的. 又经过 ...

  8. update join和delete join

    UPDATE ASET A.A2 = B.B2FROM BINNER JOIN AON A.A1 = B.B1WHERE B.B2 = "XXX" 上面的语句在SQL SERVER ...

  9. mysql 如果没有密码 就不能远程连接

    mysql 如果没有密码 就不能远程连接

  10. Rational Rose 2007破解版

    首先下载好软件,链接在这里 链接:https://pan.baidu.com/s/1op-W-ZX1tqefHffs3m-r0A 提取码:0jwm 这里面包含了Rational Rose 2007版的 ...