图Graph及相关算法(Dijkstra,Kruskal)

news2024/11/13 10:50:57

目录

无向图

有向图

邻接矩阵

邻接表

图的bfs,dfs

二部图(二分图)

有向无环图(DAG)

拓扑排序(Topological Sort)

AOV网

迪杰斯特拉Dijkstra

最小生成树

克鲁斯卡尔:Kruskal

普里姆:prim


图是多对多关系,是顶点和边的二元组和。

无向图

1.依附关系:边(v1,v2)依附于顶点v1,v2。

2.完全图:所有可能的边都存在C_{n}^{2}

3.路径:一个点到另一个点的边。

4.简单路径:除起点终点可能相同外,其他点不允许重复出现。

5.连通:有路径可通。(有n个点,可能联通需要n-1条边,一定能联通C_{n-1}^{2}+1,拿掉一个点完全联通图+1)

6.连通图:图中所有点之间均有路径可通。

7.子图:子图顶点集合\epsilon原顶点集合,边集合\epsilon边集合。

8.极大连通子图(连通分量):画圈的就是。

有向图

1.连通图:相异成对顶点间路径可通。

2.极大连通子图(强连通分量):成对顶点间均有路径可通。

3.用<v1,v2>。

邻接矩阵

边多适用,唯一。

12345
101110
210101
311011
410101
501110

邻接表

边少适用,不唯一。

图的bfs,dfs

图的创建:(1)顶点个数(2)申请并初始化(3)放边

DFS:(1)标记数组(2)遍历:1.打印顶点2.标记(3)标记邻接点,找邻接的未处理过的同(2)

BFS:(1)Queue(2)标记初始化(3)起始顶点入队标记(4)处理:弹出,打印,遍历邻接点,未处理邻接点入队,标记,等待处理重复(4)

#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
typedef struct node
{ 
	int nedge;
	int nV;
	int* pjuzhen;
}Graph;
Graph* Create()
{
	Graph* pGraph = (Graph*)malloc(sizeof(Graph));
	//顶点个数,边的条数
	int nv, ne;
	cin >> nv >> ne;
	pGraph->nedge = ne;
	pGraph->nV = nv;
	pGraph->pjuzhen = (int*)malloc(sizeof(Graph) * nv * nv);
	memset(pGraph->pjuzhen, 0, sizeof(Graph) * nv * nv);
	for (int i = 0; i < ne; i++)
	{
		int v1, v2;
		cin >> v1 >> v2;
		if (v1>=1&& v1<=nv&&v2>=1&&v2<=nv&&v1!=v2&&pGraph->pjuzhen[(v1 - 1) * nv + v2 - 1] == 0)
		{
			pGraph->pjuzhen[(v1 - 1) * nv + v2 - 1] = 1;
			pGraph->pjuzhen[(v2 - 1) * nv + v1 - 1] = 1;
		}
		else i--;
	}
	return pGraph;
}
void DFSGraph(Graph* pGraph, int fir, int* pMark)
{
	cout << fir << " ";
	pMark[fir - 1] = 1;
	for (int i = 0; i < pGraph->nV; i++)
	{
		if (pGraph->pjuzhen[(fir - 1) * pGraph->nV + i] == 1 && pMark[i] == 0)
		{
			DFSGraph(pGraph, i + 1, pMark);
		}
	}
}
void BFS(Graph* pGraph, int fir)
{
	if (pGraph == NULL || fir<1 || fir>pGraph->nV)return;
	int* pMark = NULL;
	pMark = (int*)malloc(sizeof(int) * pGraph->nV);
	memset(pMark, 0, sizeof(int) * pGraph->nV);
	queue<int>q;
	q.push(fir);
	pMark[fir - 1] = 1;
	while (!q.empty())
	{
		fir = q.front();
		q.pop();
		cout << fir << " ";
		for (int i = 0; i < pGraph->nV; i++)
		{
			if (pGraph->pjuzhen[(fir - 1) * pGraph->nV + i] == 1 && pMark[i] == 0)
			{
				q.push(i + 1);
				pMark[i] = 1;
			}
		}
	}free(pMark);
	pMark = NULL;
}
void DFS(Graph* pGraph,int fir)
{
	if (pGraph == NULL || fir < 1 || fir>pGraph->nV)return;
	int* pMark=NULL;
	pMark = (int*)malloc(sizeof(int)*pGraph->nV);
	memset(pMark, 0, sizeof(int) * pGraph->nV);
	DFSGraph(pGraph, fir, pMark);
	free(pMark);
	pMark = NULL;
}
int main()
{
	Graph* p = Create();
	for (int i = 0; i < p->nV * p->nV; i++)
	{
		if (i % p->nV == 0)cout << endl;
		cout << p->pjuzhen[i] << " ";
	}
	cout << endl;
	DFS(p, 2);
	cout << endl;
	BFS(p, 4);
	cout << endl;
	return 0;
}

二部图(二分图)

G=(u,v,e),u,v都是顶点集合,边是发生在集合之间的,但是集合内部没边关系。

例如:这个就不是,因为v2和v4是一个集合的它们相连了。

例如:这个就是。

有向无环图(DAG)

例:

有向无环图一定有拓扑排序。

拓扑排序(Topological Sort)

为一个项目内具各依赖关系的活动求得可执行的线性顺序。这个线性顺序叫拓扑序列。

拓扑序列:若从顶点vi到vj有一条路径,则在顶点的拓扑序列中顶点vi必在顶点vj之前。

有拓扑排序的一定是DAG。

AOV网

AOV没有回路的前提下,可以将全部活动排序列成拓扑序列。

步骤:

(1)统计所有顶点入度。

(2)创建队列。

(3)入度为0的节点入队。

(4)处理 :出队,所有邻接点的入度更新,新的入度为0的节点入队。

迪杰斯特拉Dijkstra

点到点的最短路径:

v1v2v3v4
v10760
v2120229
v311500
v402360

这里写一下v1到各个点的最短距离。

v1{0,7,6,0}                 (找数最小不为0的点)

v1,v3{0,7,6,0}           (v3->v2为5,5+6<7,所以为7,v3到不了v4还是为0)

v1,v3,v2{0,7,6,16}    (v2->v4为9,9+7=16)

最小生成树

克鲁斯卡尔:Kruskal

按路径长度从小到大排序,如果两点已经连通就跳过。

例:

先是3,4,5,6路径连上。

由于v4,v7已经联通所以跳过11。

连上15,20,结束。

普里姆:prim

假设从v1节点寻找。

v1->v3,v1->v4,v1->v8中v1->v8最小。

v1->v3,v1->v4,v8->v7中v8->v7最小,所以选v8->v7。

v1->v3,v1->v4,v7->v4,v7->v6中,v1->v4最小,选v1->v4。

v1->v3,v4->v3,v4->v5,v4->v6,v7->v6中,v4->v3最小,选v4->v3。

后续同理(由于v4,v7已经连通所以看下一个15)。

结果:

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

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

相关文章

回归预测 | Matlab基于SAO-BiLSTM雪融算法优化双向长短期记忆神经网络的数据多输入单输出回归预测

回归预测 | Matlab基于SAO-BiLSTM雪融算法优化双向长短期记忆神经网络的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SAO-BiLSTM雪融算法优化双向长短期记忆神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于SAO-B…

Linux系统——Mysql索引补充知识

目录 一、索引介绍 1.索引的优点 2.索引的分类 3.索引的技术名词 3.1回表 3.2覆盖索引 3.3最左匹配 3.4索引下推 4.索引匹配方式 4.1全值匹配 4.2最左前缀匹配 4.3匹配列前缀 4.4匹配一个范围值 4.5精确匹配某一列并范围匹配另一列 4.6只访问索引的查询 一、索引…

银行OA系统|基于SpringBoot架构+ Mysql+Java+ B/S结构的银行OA系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

【Charles如何对手机APP进行抓包和弱网测试】

一、Charles对APP抓包 1、前提条件&#xff1a; 1&#xff09;电脑上必须安装Charles工具&#xff0c;如没有安装可参考&#xff1a;【Charles抓包工具下载安装详细操作步骤】-CSDN博客 2&#xff09;手机和电脑必须在同一个局域网内&#xff08;连接同一个WiFi&#xff09;…

Linux信号补充——信号捕捉处理

一、信号的捕捉处理 ​ 信号保存后会在合适的时间进行处理&#xff1b; 1.1信号处理时间 ​ 进程会在操作系统的调度下处理信号&#xff0c;操作系统只管发信号&#xff0c;即信号处理是由进程完成的&#xff1b; ​ 1.信号处理首先进程得检查是否有信号&#xff1b;2.进程…

异地组网需求如何实现?

在当今信息化时代&#xff0c;越来越多的企业和个人在不同地区之间需要进行远程通信和数据传输。由于网络环境的差异和网络隔离等原因&#xff0c;异地组网的需求愈发迫切。本文将介绍一款名为【天联】的异地组网内网穿透产品&#xff0c;它的出现有效解决了不同地区间电脑、设…

基于Arduino IDE 野火ESP8266模块WIiFi开发

一、函数介绍 头文件 #include <ESP8266WiFi.h> #include <ESP8266WiFiMulti.h>ESP8266WiFi.h库主要用于连接单个WiFi网络。如果需要连接到多个WiFi网络&#xff0c;例如在需要切换不同网络或者备用网络时&#xff0c;可以使用ESP8266WiFiMulti.h头文件&#xff…

供应链投毒预警 | 恶意Py组件tohoku-tus-iot-automation开展窃密木马投毒攻击

概述 上周&#xff08;2024年3月6号&#xff09;&#xff0c;悬镜供应链安全情报中心在Pypi官方仓库&#xff08;https://pypi.org/&#xff09;中捕获1起新的Py包投毒事件&#xff0c;Python组件tohoku-tus-iot-automation 从3月6号开始连续发布6个不同版本恶意包&#xff0c…

SAP前台处理:物料计价方式:价格控制与价格确定 - 01

一、背景&#xff1a; 物料主数据中我们讲解到物料的计价方式&#xff0c;SAP应用到的主要计价方式有移动平均价和标准价格方式两种&#xff0c;但也有按照批次计价等方式&#xff0c;我们主要介绍最常用的V2移动平均价和S3的标准价格&#xff1b; 二、不同组合下的差异&…

知识蒸馏——深度学习的简化之道 !!

文章目录 前言 1、什么是知识蒸馏 2、知识蒸馏的原理 3、知识蒸馏的架构 4、应用 结论 前言 在深度学习的世界里&#xff0c;大型神经网络因其出色的性能和准确性而备受青睐。然而&#xff0c;这些网络通常包含数百万甚至数十亿个参数&#xff0c;使得它们在资源受限的环境下&…

【HM】STM32F407 HAL库 PWM

PWM简介 脉冲宽度调制&#xff08;PWM&#xff09; 是一种数字信号&#xff0c;最常用于控制电路。该信号在预定义的时间和速度中设置为高&#xff08;5v或3.3v&#xff09;和低&#xff08;0v&#xff09;。通常&#xff0c;我们将PWM的高电平称为1&#xff0c;低电平为0。 …

pyboard开发板上手

文章目录 准备开发板连接到pyboard开发板将pyboard作为U盘打开编辑main.py重启pyboard 准备开发板 本文介绍了如何使用MicroPython在pyboard开发板上运行你的第一个程序&#xff0c;所以&#xff0c;在开始下面的步骤前&#xff0c;你需要有一块pyboard开发板&#xff0c;如果…

OKR如何与个人绩效评估和激励相结合?

在现代企业管理中&#xff0c;个人绩效评估与激励是提升员工积极性、推动企业发展的关键环节。而OKR&#xff08;目标与关键成果&#xff09;作为一种高效的目标管理方法&#xff0c;通过与个人绩效评估和激励相结合&#xff0c;可以进一步提升员工的工作动力和工作效率&#x…

数据机构-2(顺序表)

线性表 概念 顺序表 示例&#xff1a;创建一个存储学生信息的顺序表 表头&#xff08;Tlen总长度&#xff0c; Clen当前长度&#xff09; 函数 #include <seqlist.c> #include <stdio.h> #include <stdlib.h> #include "seqlist.h" #include &…

C#对于文件中的文件名判断问题

C#中对于文件名的判断问题&#xff0c;我们使用bool值进行值的传递&#xff0c;首先我们使用内置方法进行文件字符串匹配的bool值回传&#xff0c;我们打印出文件名以及相对应的bool&#xff0c;即可知道文件名是否真正生效 bool isHave fileName.Contains("Hello"…

【Python + Django】表结构创建

以员工管理系统为例。 事前呢&#xff0c;我们先把项目和app创建出来&#xff0c;详细步骤可以看我同栏目的第一篇、第二篇文章。 我知道你们是不会下来找的&#xff0c;就把链接贴在下面吧&#xff1a; 【Python Django】启动简单的文本页面-CSDN博客 【Python Django】…

excel所有知识点

1要加双引号 工作表&#xff08;.xlsx) 单击右键→插入&#xff0c;删除&#xff0c;移动、重命名、复制、设置标签颜色&#xff0c;选定全部工作表 工作表的移动&#xff1a;两个表打开→右键→移动&#xff08;如果右键是灰色的&#xff0c;可能是保护工作表了&#xff09…

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记17_执法工具

1. 执法工具箱 1.1. 在数据驱动的经济环境中&#xff0c;明智监管潜力无限 1.2. 多年前的司法体系与反垄断执法机构更善于发现市场漏洞&#xff0c;并设计出了直接有效的方式来化解问题 1.2.1. 大型互联网平台的权势凌驾于法律之上 1.2.1.1. 英国上议院 1.3. 反垄断执法机…

SQLiteC/C++接口详细介绍sqlite3_stmt类(九)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;六&#xff09; 下一篇&#xff1a; 无 33、sqlite3_column_table_name 函数 sqlite3_column_table_name 用于返回结果集中指定列所属的表的名称。如果查询中列使…

K8S Storage

概述 一般情况下&#xff0c;K8S中的Pod都不应该将数据持久化到Pod中&#xff0c;因为Pod可能被随时创建和删除&#xff08;扩容或缩容&#xff09;&#xff0c;即便是StatefulSet或Operator的Pod&#xff0c;也都不建议在Pod里存放数据&#xff0c;可以将数据持久化到Host上。…