当前位置: 首页 > news >正文

图论(入门版)

目录

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  婚配问题

相关文章:

  • 使用bindgen将C语言头文件转换为Rust接口代码
  • 第九层(2):STL之string类
  • Allegro如何自动做差分对内等长操作指导
  • 搜索引擎位置跟踪应用SerpBear
  • 浅析一条SQL在mysql中是如何执行的
  • 前端艺术之毛玻璃-倾斜-日历
  • Python-Flask-2023.1.24-Review
  • SpringBoot 统一功能处理
  • 3. Python列表简介
  • sidebar(侧边栏原理vue admin)
  • BERT模型结构可视化与模块维度转换剖析
  • 谈谈线程安全问题及其解决方法
  • 好客租房-12.ES接入java
  • java入门笔记
  • 进阶C语言 第二章-------《进阶指针》 (指针数组、数组指针、函数指针、回调指针)知识点+基本练习题+深入细节+通俗易懂+完整思维导图+建议收藏
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • canvas 绘制双线技巧
  • input的行数自动增减
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Just for fun——迅速写完快速排序
  • Less 日常用法
  • Lucene解析 - 基本概念
  • maya建模与骨骼动画快速实现人工鱼
  • PAT A1092
  • php ci框架整合银盛支付
  • 从零搭建Koa2 Server
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 机器学习学习笔记一
  • 聚类分析——Kmeans
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 前端技术周刊 2019-01-14:客户端存储
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 树莓派 - 使用须知
  • 温故知新之javascript面向对象
  • 想写好前端,先练好内功
  • 原生Ajax
  • 正则与JS中的正则
  • 如何正确理解,内页权重高于首页?
  • # C++之functional库用法整理
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # 透过事物看本质的能力怎么培养?
  • #每日一题合集#牛客JZ23-JZ33
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (原創) 物件導向與老子思想 (OO)
  • (转)ObjectiveC 深浅拷贝学习
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .java 9 找不到符号_java找不到符号
  • .Net IOC框架入门之一 Unity
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)