图论(入门版)

news2024/11/26 20:31:47

目录

1  向、权

 2  最小生成树

2.1  Prim算法

2.2  Kruskal算法

3  最大流问题

3.1  Naive算法

3.2  Ford—Fulkerson算法

3.3  Edmonds—Karp算法

3.4  Dinic算法

4  最小割问题

5  二部图

5.1  判断是否是二部图的方法

5.2  匈牙利算法(最小匹配问题)

5.3  最大匹配问题

5.4  婚配问题


1  向、权

向:一点和另一点之间有单向和双向两种情况

如果A与B间是双箭头或一条无向线相连,代表无向,即可以从A走向B,也可以从B走向A

权:从一点到另一点的代价

如果任何点之间的代价相同,代表无权,反之,则有权

所以,可以分为四类图:无向无权图、无向有权图、有向无权图、有向有权图

对于无权图,可以运用队列+搜索思想,把起点压入队列,然后把起点弹出队列,同时找到能直接到达的结点并压入队列,循环多次直到队列为空时结束循环,可以把所有结点都遍历一遍。

对于有权图,运用优先队列+搜索思想,和上面操作等同,但要同时记录权。

下图是有向无权图:

 2  最小生成树

图和树最大的区别是树一定不能有回路,图没有要求,所以说树是特殊的图

2.1  Prim算法

思路:找已搜索过的点和未搜索过的点之间的最小通路

1:随机找一个起点

2:搜索出所有的和起点连通的路

3:找出代价最小的一条路并连接,这个点和起点在一棵树上

4:按照前面的步骤进行循环,直到所有的点都在一棵树上

判断是否在一棵树上用并查集:

#include <iostream>
using namespace std;

int n,m,p;
const int N=5e3+10;
int fa[N];

int init()
{
	for(int i=0;i<N;i++)
	{
		fa[i]=i;
	}
}

int find(int x)
{
	int t=x;

	while(t!=fa[t])
	{
		t=fa[t];
	}
	while(x!=fa[x])
	{
		int temp=fa[x];
		fa[x]=t;
		x=temp;
	}
}

void merge(int a,int b)
{
	a=find(a);
	b=find(b);
	if(a!=b)
	{
		fa[b]=a;//结合到一起,也可以是fa[a]=b;
	}
}

int main()
{
	cin>>n>>m>>p;
	init();//初始化父节点; 
	int u,v;
	while(m--)
	{
		cin>>u>>v;
		merge(u,v);
	}
	while(p--)
	{
		cin>>u>>v;
		u=find(u);
		v=find(v);
		puts(u==v?"Yes":"No");
	}
}

2.2  Kruskal算法

直接把所有路的代价按照从小到大排序,并按此顺序连接结点,注意在连接结点前要判断两结点是否已经在一棵树内,若在一棵树内,则直接跳过。

3  最大流问题

对于一张建设好的网络(流网络)(各边上的数值表示流的容量限制,箭头表示流动方向,该网络的建设好后不允许更改):

考察其最大流是指从源点提供流(假设提供能力总是充足的)
那么管道中的流从s->t的过程中所能达到的最大值是多少? 

3.1  Naive算法

这种算法不是好的算法,对于一些情况来说不能算出最好结果,但这种算法为后面的好的算法提供思路。

找简单路(不绕圈的路,即所有路过的结点不重复,随便找一条符合条件的就行)和简单路中的最小权重,所以这段水流=这条最小路的权重,然后把消耗值减掉,再把权重为0的边去掉,如果起点和终点已经不在一棵树内,则停止循环。这里计算出的“最大流”成为阻塞流

3.2  Ford—Fulkerson算法

这种算法比Naive算法多出的一条是,消耗值要反向加回到图中,而不是简单的减去就结束了

3.3  Edmonds—Karp算法

这种算法比Ford—Fulkerson算法多出的一条是,找简单路时要找最短路径

3.4  Dinic算法

思路:

1:画一张阶梯图(要求路只能连接不同层之间的结点),并计算阻塞流(Naive算法)

2:把Naive算法中算出的所有路的消耗值反向加回到原图中

3:根据2得到的图画阶梯图,然后进入步骤1(来回循环),当找不到阻塞流时结束循环

4  最小割问题

选取某些路并割去,使得没有一条路能从起点走到终点,割去路的加和最小值=最小割

结论:最大流=最小割

5  二部图

5.1  判断是否是二部图的方法

1:随意找一个点染成红色

2:把红色结点的邻接结点染成蓝色

3:把蓝色结点的邻接结点染成红色

4:如此往复,如果此过程没有出现矛盾,则是二部图

5.2  匈牙利算法(最小匹配问题)

这里假设有两个集合U和V,每个集合有三个元素u1、u2、u3、v1、v2、v3。

画一张表格:

u1u2u3
v18910
v2739
v3562

减去每行最小值和每列最小值:

u1u2u3
v10(-8)1(-8)2(-8)
v24(-3)0(-3)6(-3)
v33(-2)4(-2)0(-2)

使得每一行每一列都出现至少一个0。然后对0相应的元素的原始值进行处理即可。

图形思路:

 色块和白块分别有4个,如何才能使匹配量最多?

 M1可以和NA直接匹配

M2发现此时NA已经被匹配了,把M1和NA强行分开,M1此时就找NC匹配

  M3找NB匹配,但这样的话M4就不能匹配了,所以M3只能和ND匹配,这样M4也能匹配

5.3  最大匹配问题

把原始数据变成相反数,变成最小匹配问题即可。

5.4  婚配问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/177739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跳跃表,也称跳表

跳表是Redis五种数据结构中有序集合Zset的底层实现 可以看成多个有序链表 链表相较于数组删除和插入的效率要高很多&#xff08;改变指针指向就行&#xff09; 但是在查找的时候跟数组比起来&#xff0c;速度就比较慢了&#xff0c;因为链表需要从头开始遍历 为了改变这个查找…

索宝蛋白冲刺A股上市:计划募资5.5亿元,复星等为其股东

近日&#xff0c;宁波索宝蛋白科技股份有限公司&#xff08;下称“索宝蛋白”&#xff09;预披露更新招股书&#xff0c;准备在上海证券交易所主板上市。据贝多财经了解&#xff0c;索宝蛋白曾于2022年7月1日提交招股书&#xff0c;此次招股书更新了截至2022年6月30日的财务数据…

Java判断结构练习

目录 1.倍数 2.零食 3.区间 4.三角形 5.游戏时间 6.加薪 7.动物 8.选择练习1 9.DDD 10.点的坐标 11.三角形类型 12.游戏时间2 13.税 14.简单排序 15.一元二次方程公式 16.平均数3 1.倍数 读取两个正整数值 A 和 B。 如果其中一个是另一个的整数倍&#xff0c…

树状数组(代码模板和原理详解)

树状数组代码模板 普通数组&#xff1a;求前缀和&#xff1a; O(n)O(n)O(n)&#xff0c;修改&#xff1a;O(1)O(1)O(1) 前缀和数组&#xff1a;求前缀和&#xff1a;O(1)O(1)O(1)&#xff0c;修改&#xff1a;O(n)O(n)O(n) 鱼和熊掌不可兼得&#xff0c;当我们同时需要对一个…

NEZUKO: 1——202201152003

NEZUKO: 1——202201152003 About Release Back to the Top Name: nezuko: 1Date release: 21 Aug 2019Author: yunaranyancatSeries: nezuko Download Back to the Top Please remember that VulnHub is a free community resource so we are unable to check the machin…

在Java中使用堆排序求解TopK问题

在Java中使用堆排序求解TopK问题 1. 问题描述 给定一个很大的数组&#xff0c;长度100w&#xff0c;求第k大的数是多少&#xff1f; 这个问题是一个很经典的问题&#xff0c;如果采用传统方式&#xff0c;即现排序&#xff0c;然后找到第k个数&#xff0c;对于数据量很大的时…

Knowledge-based-BERT(一)

多种预训练任务解决NLP处理SMILES的多种弊端&#xff0c;代码&#xff1a;Knowledge-based-BERT&#xff0c;原文&#xff1a;Knowledge-based BERT: a method to extract molecular features like computational chemists&#xff0c;代码解析从K_BERT_pretrain开始。模型框架…

Tkinter的Listbox控件

Tkinter的Listbox控件是个选项框&#xff0c;主要是用来在给定的选项中选择一个 使用方法 创建选项框Listbox 和其他控件的创建方法一样&#xff0c;直接创建即可&#xff0c;命名为Lb Lbtk.Listbox(root) Lb.pack() 在选项框中加入选项 可以边创建边添加&#xff0c;即利…

【C#】WPF实现经典纸牌游戏,适合新手入门

文章目录1 纸牌类2 布局3 初始化4 事件点击牌堆拖动牌的去留源代码1 纸牌类 之所以产生这个无聊至极的念头&#xff0c;是因为发现Unicode中竟然有这种字符。。。 黑桃&#x1f0a1; &#x1f0a2; &#x1f0a3; &#x1f0a4; &#x1f0a5; &#x1f0a6; &#x1f0a7; &…

【设计模式】结构型模式·外观模式

学习汇总入口【23种设计模式】学习汇总(数万字讲解体系思维导图) 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01;> 学习汇总入口 一.概述 外观&#xff08;Facade&#xff09;模式是七大设计原则“迪米特法则…

谷粒商城-高级篇-Day12-性能压测和缓存

文章目录性能优化nginx动静分离优化三级分类的获取&#xff08;优化业务&#xff09;分布式缓存整合redis高并发下的缓存失效问题缓存穿透缓存雪崩缓存击穿解决这些问题分布式锁Redisson可重入锁&#xff08;Reentrant Lock&#xff09;指定过期时间读写锁闭锁信号量使用Redssi…

Python实现一个简易的CLI翻译程序

Python实现一个简易的CLI翻译程序Python百度翻译API实现一个简易的CLI翻译程序获取百度翻译API编写一个简单的Python程序Python百度翻译API实现一个简易的CLI翻译程序 之前翻译用的linux上的golddict,每次翻译都很慢。。。 所以想写一个简单快速的翻译命令行翻译软件 获取百度…

Allegro如何自动高亮不等长的网络操作指导

Allegro如何自动高亮不等长的网络操作指导 在做PCB设计的时候,时常需要要做等长,Allegro可以自动高亮一组内不等长的网络,可以直观的看到哪些网络长度是不满足的,类似下图 绿色的是通过的,红色是长度不足的,粉色是超长的 具体操作如下 选择Route-Timing Vision出现optio…

Springboot359的医院病历管理系统

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 2 第3章 系统分析 3 3.1 需求分析 3 3.2 系统可行性分析 4 3.2.1技术可行性&#xff1a;技术背景 4 3.2.2经济…

Ubiquiti MAC Address Changer 3.0 Crack

Ubiquiti MAC Address Changer&#xff0c;目前mac address changer的版本有很多&#xff0c;本次发布的是V3版本&#xff0c;这是一款功能非常强大的修改网卡mac地址软件&#xff0c;基本上所有的网卡MAC地址都支持修改&#xff0c;包括虚拟机和TeamViewer软件都是支持的。 Ea…

5、基本数据类型

目录 一、整数类型 二、浮点类型 三、字符类型 四、布尔类型 一、整数类型 整数类型用来存储整数数值&#xff0c;即没有小数部分的数值。可以是正数&#xff0c;也可以是负数。整 型数据在Java程序中有3种表示形式&#xff0c;分别为十进制、八进制和十六进制。 1.十进…

2.4.4 数值类型的转换

文章目录1.运算时的自转2.运算时的强转3.强转时的精度丢失问题1.运算时的自转 不同数字类型之间的大小关系如下&#xff1a;double > float > long > int > char, short,byte 自转&#xff1a;小类型的数据可以直接赋值给大类型的变量&#xff1b; byte short c…

Linux(五)创建一个miniShell

前情提要&#xff1a;掌握进程控制中的进程创建、进程终止、进程等待、进程替换。可以参考下方博文 LInux&#xff08;四&#xff09;进程控制&#xff08;创建、终止、等待、替换&#xff09; 了解strtok函数的使用 正文&#xff1a; 目录 Shell是什么&#xff1f; 如何…

蓝桥杯之二分与前缀和

蓝桥杯之二分二分板子&#xff1f;第一次和最后一次出现的位置机器人跳跃问题四平方和分巧克力&#xff1f;典型二分找大的&#xff08;从右往左找&#xff09;二分upper_bound(a1,an1,x)-a&#xff1f;递增三元组前缀和取余&#xff1f;K倍区间二维前缀和&#xff1f;激光炸弹…

17种编程语言实现排序算法-合并排序

开源地址 https://gitee.com/lblbc/simple-works/tree/master/sort/ 覆盖语言&#xff1a;C、C、C#、Java、Kotlin、Dart、Go、JavaScript(JS)、TypeScript(TS)、ArkTS、swift、PHP。 覆盖平台&#xff1a;安卓(Java、Kotlin)、iOS(SwiftUI)、Flutter(Dart)、Window桌面(C#)、…