浅谈【数据结构】图-图的概念

news/2024/9/18 20:45:36/ 标签: 数据结构, 算法, c语言, c++, 开发语言, 图论

目录

1、图

1.1图的分类

1.2路径

1.3连通图

2、图的存储结构

2.1数组表示法


谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注

没错,说的就是你,不用再怀疑!!!

希望我的文章内容能对你有帮助,一起努力吧!!!


1、图

图的定义:图(graph)非线性的数据结构,形式描述为:graph=(V,R)

其中V是图中元素Vn(称为顶点Vertex)的集合,当n=0,V是空集

其中R是图中顶点之间的关系集,为顶点vi、vj之间是否存在路径(关系)的判断条件。即vi、vj之 间存在关系,则关系属于R

1.1图的分类

  • 有向图(Digraph)
    • 有方向的图就是有向图
    • 有向图的那个方向的线条称为:
  • 无向图(Undigraph)
    • 没有方向的图就是无向图
    • 无向图的那个线条称为:
  • 网:
    • 若在图的关系上面,或者是上去附加一个值w,称w为弧上或者是边上的权值。
    • 带权的图称为:网(权值w的具体含义在不同的应用场景下去定义,比如:顶点表示城市)

顶点的度

顶点的度:顶点的边或者是顶点的弧条数称为:

但是有向图分为:入度和出度。

1.2路径

路径:一个顶点到另一个顶点的方式(怎么到达的)

1.3连通图

两个顶点之间存在路径(到达方式),说明它们是连通。若任意两个顶点之间都是连通的话,则图是连 通图。

有向图则称为:强连通图

2、图的存储结构

数组表示法、邻接表、逆邻接表、十字链表、...

2.1数组表示法

数组表示法:又称邻接矩阵

使用一个二维数组来描述图的顶点之间的关系集R。 G=(V,R)

用一个一维数组来存储图中顶点集V

***示例代码***

#include <iostream>// 顶点数量是10个
#define VertexMaxCount 10// 图类型
typedef struct 
{// 关系集bool R[VertexMaxCount][VertexMaxCount];// 顶点集std::string V[VertexMaxCount];// 顶点数量int vertex_count;
}Graph;// 关系类型
typedef  struct 
{int index_s; // 关系开始顶点下标int index_e; // 关系结束顶点下标bool r;  // 关系
}R;/*@brief 为一个邻接矩阵图增加一个顶点@param graph  需要增加顶点的图指针@param vertex 需要增加的顶点
*/
void addVertex(Graph *graph,std::string vertex)
{// 判断图是否存在if(!graph)return;// 添加新顶点graph->V[graph->vertex_count] = vertex;// 更新顶点数量graph->vertex_count++;
}int getIndex(Graph*graph,std::string vertex)
{if(!graph)return -1;for(int index=0;index < VertexMaxCount;index++)if(graph->V[index] == vertex)return index; // 返回顶点在图中的下标return -1; // 表示顶点不在图中
}/*@brief 为一个邻接矩阵图增加关系@param graph 需要增加关系的图指针@param r 增加新关系
*/
void addR(Graph *graph,R r)
{// 判断图是否存在if(!graph)return;// 添加关系graph->R[r.index_s][r.index_e] = r.r;
}Graph *creatGraph()
{// 申请了一个邻接矩阵的空间Graph * graph = new Graph;std::cout << "请依次输入顶点:";// 增加顶点while(1){std::string vertex = "结束";std::cin >> vertex;if(vertex == "结束")break; // 增加进入图addVertex(graph,vertex);}// 先初始化关系for(int row = 0;row < VertexMaxCount;row++){for(int column = 0;column < VertexMaxCount;column++)if(row == column)graph->R[row][column] = true;elsegraph->R[row][column] = false;}// 增加关系while(1){std::cout << "请输入顶点之间的关系:";std::string start_vertex = "结束";std::string end_vertex = "结束";std::cin >> start_vertex;std::cin >> end_vertex;if(start_vertex == "结束"||end_vertex == "结束")break;R r;r.index_s = getIndex(graph,start_vertex);r.index_e = getIndex(graph,end_vertex);r.r = true;// 判断结点下班是否有效if(r.index_s == -1||r.index_e == -1)continue;// 存入关系addR(graph,r);}return graph;
}/*@brief 打印一个邻接矩阵图@param graph 需要打印的邻接矩阵图指针
*/
void printGraph(Graph *graph)
{if(!graph)return ;std::cout << "\t";// 打印顶点for(int count=0;count < VertexMaxCount;count++)std::cout << graph->V[count] << "\t";std::cout << std::endl;// 打印关系for(int row = 0;row < VertexMaxCount;row++){std::cout << graph->V[row] << "\t";for(int column = 0;column < VertexMaxCount;column++){// 存在关系if(graph->R[row][column])std::cout << "○";elsestd::cout << "×";std::cout << "\t";}std::cout << std::endl;}
}int main()
{Graph *g = creatGraph();printGraph(g);delete g;return 0;
}


http://www.ppmy.cn/news/1518776.html

相关文章

华为手机数据丢失如何恢复?

在智能手机普及的今天&#xff0c;华为手机凭借其卓越的性能和用户体验赢得了众多用户的青睐。然而&#xff0c;在使用过程中&#xff0c;我们难免会遇到数据丢失或误删除的情况。面对这一困境&#xff0c;许多用户可能会感到束手无策。别担心&#xff0c;本文将为你提供一份全…

分享一个基于Python的广东热门旅游数据可视化分析系统flask毕设(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

安装vue-cli2.0并创建项目

文章目录 1 安装node2 安装vue-cli3 创建基于webpack模板的项目4 项目结构 1 安装node 之前写的博客中介绍了如何安装&#xff1a;NodeJS的安装【windows】。安装完毕后&#xff0c;可以在命令行中输入node -v和npm -v&#xff0c;若出现版本号&#xff0c;则安装成功。 2 安…

Golang 读取文件

GoLang读取文件需要用到os类去打开文件&#xff0c;然后再用其他方式分析文件里的内容。打开文件比较简单&#xff0c;使用os.Open就可以了&#xff0c;记住用defer关闭就行。但是读取文件内容就头疼了&#xff0c;以文本文件为例子&#xff0c;就有各种方式 读取到byte数组 首…

我如何解决 java.lang.ClassNotFoundException:javax.xml.bind.DatatypeConverter

优质博文&#xff1a;IT-BLOG-CN 问题 我如何解决java.lang.ClassNotFoundException&#xff1a;javax.xml.bind.DatatypeConverter 2024-08-25T02:31:25.46202:00 ERROR 21868 --- [fintonic-oauth] [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet…

亚马逊云(AWS)技术深度解析及代码使用案例

亚马逊云&#xff08;AWS&#xff09;技术深度解析及代码使用案例 引言 亚马逊云&#xff08;Amazon Web Services&#xff0c;简称AWS&#xff09;作为全球云计算技术的首创者和领导者&#xff0c;以其强大的基础设施、丰富的服务种类以及卓越的安全性&#xff0c;持续引领着…

EmguCV学习笔记 VB.Net 第9章 视频操作

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

uniapp小程序实现横屏手写签名

<template><view class"signBox column-me"><!-- 这个是自定义的title-可根据自己封装的title的作为调整 --><status-bar title"电子签名" :bgColor"null"></status-bar><view class"topHint">请…

贪心算法---加油站

题目&#xff1a; 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 给定两个整数…

用 CSS 实现太阳系运行效果

介绍实现最终效果结语介绍 在编程的浩瀚宇宙中,我们总是在探索能够以最简洁的方式创造出最酷炫效果的方法。而使用 CSS 制作响应式太阳系,绝对能提升你的编程乐趣。 如何用 CSS 实现这个神奇的太阳系呢?关键在于巧妙运用 CSS 的动画、定位和尺寸属性。通过定义不同的元素来…

【论文阅读】基于生成对抗网络的模型窃取方法的研究(2021)

Research on Model Stealing Method Based on Generative Adversarial Networks 提出了一种基于生成对抗网络的模型窃取方法——GBMS(Generative adversarial networks Based Model Stealing method)&#xff0c;GBMS允许攻击者在没有真实数据的情况下训练替代模型&#xff0c;…

数据导出为Excel接口报错:java.io.IOException: UT010029: Stream is closed

在Spring框架中&#xff0c;开发过程中经常需要实现数据的导出功能&#xff0c;尤其是将数据导出为Excel文件。然而&#xff0c;在实现这样的功能时&#xff0c;可能会遇到一些意料之外的错误&#xff0c;比如java.io.IOException: UT010029: Stream is closed。本文将基于一个…

云同步的使用

云同步技术是一种在多个设备或系统之间保持数据一致性的技术&#xff0c;它通常依赖于云存储服务来实现。在Java中&#xff0c;实现云同步功能通常需要与云服务提供商的API进行交互&#xff0c;如Amazon S3、Google Cloud Storage、Microsoft Azure Blob Storage等。 以下是一个…

Web自动化测试实战--博客系统

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;测试&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1.项目效果展示 2.编写web测试用例 3.自动化测试脚本开发 3.1创建空项目 引…

YeAudio音频工具的介绍和使用

夜雨飘零音频工具 这款Python音频处理工具功能强大&#xff0c;支持读取多种格式的音频文件。它不仅能够对音频进行裁剪、添加混响、添加噪声等多种处理操作&#xff0c;还广泛应用于语音识别、语音合成、声音分类以及声纹识别等多个项目领域。 安装 使用pip安装。 pip ins…

设计模式-结构型模式-享元模式

1.享元模式定义 摒弃了在每个对象中保存所有数据的方式&#xff0c;通过共享多个对象所共有的相同状态&#xff0c;从而让我们能在有限的内存容量中载入更多对象&#xff1b; 1.1 享元模式优缺点 优点 极大减少内存中相似或相同对象数量&#xff0c;节约系统资源&#xff0c…

window下kafka3启动多个

准备工作 我们先安装好kafka&#xff0c;并保证启动成功&#xff0c;可参考文章Windows下安装Kafka3-CSDN博客 复制kafka安装文件 kafka3已经内置了zookeeper&#xff0c;所以直接复制就行了 修改zookeeper配置文件 这里我们修改zookeeper配置文件&#xff0c;主要是快照地址…

前端的面试题

Class 与 Style 如何动态绑定&#xff1f; 对象语法&#xff1a; <div v-bind:class"{ active: isActive, text-danger: hasError }"></div> data: {isActive: true,hasError: false }数组语法&#xff1a; <div v-bind:class"[isActive ? acti…

使用tinyxml向xml文件中插入数据

目前已有一个xml文件&#xff0c;内容如下所示。想要在这个文件中间插入一个数据。tinyxml库比较好用。 1.下载tinyxml库文件并添加进工程 在网上下载好tinyxml的库文件&#xff0c;然后放入项目目录中 在qt工程中点击【添加现有文件】&#xff0c;把这6个文件添加进来 2.使…

【WPF】WPF学习之【二】布局学习

WPF布局学习 常用布局Grid网格布局StackPanel 布局CanvasDockPanel布局WrapPanel布局 常用布局 1、StackPanel: 学习如何使用StackPanel进行垂直和水平布局。 2、Grid: 掌握Grid的网格布局技术。 3、Canvas: 了解Canvas的绝对定位布局。 4、DockPanel: 学习DockPanel的停靠…