邻接矩阵实现图的存储

news2024/9/21 1:30:50

目录

一. 前言

二. 用邻接矩阵来实现图的存储


一. 前言

1. 图的定义

        所谓图就是包含顶点和边的集合,是一种多对多的关系。用符号表示为:G=(V,E)。其中,V代表顶点(数据元素)的有穷非空集合,E代表边的有穷集合。也就是说一个图可以没有边,但顶点不能没有。

2. 有向图和无向图

        顶点之间靠一个带有方向的弧连接的图就叫有向图,无向图则相反,边并没有方向。

3. 完全图

        任意两个点都有一条边相连的图。如下所示:

4.稀疏图和稠密图

        稀疏图就是有很少边或弧的图。而稠密图则是有较多边和弧的图。

5. 权和网

        图中边或弧所具有的相关数称为权。表明从一个顶点到另外一个顶点的距离或耗费。而网就是边或者弧带权的图,也就分为无向网和有向网。

6.连通图(强连通图)

        在无(有)向图G中,若对任何两个顶点v,u都存在从v到u的路径,则称G是连通图(强连通图)。

7. 连通分量(强连通分量)

        无向图(有向图)的极大连通子图称为G的连通分量(强连通分量)。其中,极大连通子图的含义为:该子图是G连通子图,但如果将G的任何不在该子图中的顶点加入,那么这个子图将不再连通,我们就称这样的连通子图为极大连通子图。

8. 极小连通子图

        该子图是G的连通子图,在该子图中删除任何一条边,子图不再连通。

9. 邻接矩阵

        所谓邻接矩阵,拿无向图来举例,就如下所示:

因为v1和v2是相连的,并且这是一个无向图,并没有权值。所以就在v1行v2列的数字为1。邻接矩阵中为0的地方,就代表那两个顶点并没有直接相连。

如果是无向网(表示有权值的图),就不是在相连的地方赋值1了,而是赋值这两个顶点所连边的权值。如下所示:

 

二. 用邻接矩阵来实现图的存储

        我们上面知道了这个存储结构的原理之后,就可以考虑用代码来实现了。用邻接矩阵来创建一个无向图的代码如下所示:

#include<iostream>
using  namespace std;

#define MAXnum 100

//邻接矩阵的结构类型定义
typedef struct{
    char vexs[MAXnum];    //定义一个数组存放顶点,作为顶点表
    int arcs[MAXnum][MAXnum];    //邻接矩阵
    int vexnum,arcnum;    //图当前的顶点数和边数
}AMGraph;    //Adjacency Matrix Graph

int LocateGraph(AMGraph G,char c);

int Create(AMGraph &G){
    cout<<"请输入总的顶点数和边数(中间用空格隔开):";    
    cin>>G.vexnum>>G.arcnum;    //先输入总的顶点数和边数
    
    for(int i=0;i<G.vexnum;i++){    //依次输入顶点信息,有几个顶点就输入几个
        cout<<"请输入顶点信息(顶点名称):";
        cin>>G.vexs[i];
    }
    
    //接着给所有的边的权值赋一个最大值
    for(int i=0;i<G.vexnum;i++){
        for(int j=0;j<G.vexnum;j++){
            G.arcs[i][j]=65536;
        }
    }
    
    //开始录入边的信息
    for(int i=0;i<G.arcnum;i++){
        char v1;    //用这两个变量来接收两个顶点的值
        char v2;
        int w;    //接收权值
        cout<<"请输入其中一条边两边的顶点和权值:";
        cin>>v1>>v2>>w;
        int n=LocateGraph(G,v1);    //通过这个函数来获取这两个顶点在顶点表中的序号
        int m=LocateGraph(G,v2);
        G.arcs[n][m]=w;    //给邻接矩阵重新赋值
        G.arcs[m][n]=w;
    }
return 1;
}

int LocateGraph(AMGraph G,char c){
    for(int i=0;i<G.vexnum;i++){
        if(G.vexs[i]==c) return i;
    }
    return -1;
}

int main(){
    AMGraph G;
    Create(G);    //这里我们在创建好了我们想要的邻接矩阵之后就可以进行相关操作
    cout<<G.vexs[1];    //比如我这里进行一个小测试,让它输出我们的第二个顶点名称,看是否是我们所创建的邻接矩阵
}
        
        

这里我们举了如何用邻接矩阵来实现无向网,我们要是想要用邻接矩阵来创建无向图的话,首先就得初始化邻接矩阵的权值都为0,如果有相连的再赋值为1。只需要在上面代码的基础上修改这部分的内容就行。如下所示为修改之后的部分代码(其他代码一样):

for(int i=0;i<G.vexnum;i++){
    for(int j=0;j<G.vexnum;j++){
        G.arcs[i][j]=0
    }
}
G.arcs[n][m]=1;
G.arcs[n][m]=1;

下面我们继续看看用邻接矩阵来实现有向图跟有向网,因为无向图的邻接矩阵是对称的,所以上面的代码就得出现这样的代码:

G.arcs[n][m]=w;
G.arcs[m][n]=w;

但在我们有向图中就不再需要这样了,只需要上面一行代码就行了。也就是G.arcs[n][m]=w;就够了。并且跟上面无向图一样,相连顶点的边权值为1。 

 

 

 

 

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

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

相关文章

AI4-PPOCRLabel安装

推荐环境&#xff1a; - PaddlePaddle > 2.1.2 - Python 3.7 - CUDA10.1 / CUDA10.2 - CUDNN 7.6 1、安装Anaconda 说明&#xff1a;使用paddlepaddle需要先安装python环境&#xff0c;这里我们选择python集成环境Anaconda工具包 Anaconda是1个常用的python包管理程序 安装完…

虚拟机连接xshell的三种方式

第一 桥接 改为输入 systemctl restart network 关闭自启动防火墙 systemctl stop firewalld systemctl disable firewalld 查看本机网络信息 ifconfig 连接xshell 第二 nat 第三 仅主机

探索 Electron:打造深度书籍挖掘机的搜索体验

Electron是一个开源的桌面应用程序开发框架&#xff0c;它允许开发者使用Web技术&#xff08;如 HTML、CSS 和 JavaScript&#xff09;构建跨平台的桌面应用程序&#xff0c;它的出现极大地简化了桌面应用程序的开发流程&#xff0c;让更多的开发者能够利用已有的 Web 开发技能…

react-native从入门到实战系列教程-React Native Elements

react-native的ui框架内网真的是屈指可数&#xff0c;能用的成熟的几乎找不到。不像web端的繁荣景象&#xff0c;可以用荒凉来形容不为过。 京东的nutui说也支持react-native,官网及其简陋。尝试了未成功运行&#xff0c;可能是项目类型不同&#xff0c;对比其他类型的ui库都分…

centos安装es、kibana、ik

这里es使用的是7.10.2版本的es&#xff0c;物料包下载地址如下 #注意安装的插件需和es版本保持一致 #es https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-linux-x86_64.tar.gz #kibana https://artifacts.elastic.co/downloads/kibana/kibana-7.10…

phpMyAdmin之CMS靶场

方法一&#xff1a;通过日志文件拿webshell 常用的语句如下&#xff1a; show global variables like %general%; set global general_logon; set global general_log_file D:/phpStudy_pro/WWW/muma.php; show global variables like %general%; select <?php eval($_…

广西南宁高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

南宁高校大学智能制造实验室&#xff0c;作为该地区乃至全国智能制造领域的重要研究和教学基地&#xff0c;一直致力于探索和创新智能制造技术。近日&#xff0c;该实验室的数字孪生可视化系统平台建设项目成功通过了验收&#xff0c;标志着其在数字孪生技术领域取得了重大突破…

c语言排序(2)

前言 在上一篇文章&#xff0c;我们学习了插入排序&#xff0c;选择排序以及交换排序中的冒泡排序&#xff0c;接下来我们继续学习交换排序、归并排序以及非比较排序。 1. 快速排序 快速排序是交换排序的一种&#xff0c;它的基本思想&#xff1a;任取待排序序列中的某元素作…

z3基础学习

z3基础学习 ​ z3是一个微软出品的开源约束求解器&#xff0c;能够解决很多种情况下的给定部分约束条件寻求一组满足条件的解的问题。 安装&#xff1a;pip install z3-solver 1. 简单使用 from z3 import * x Int(x) #创建名为x的int类型变量 y Int(y) solve(x y10,2*x…

【Verilog-CBB】开发与验证(1)——开个头

在Verilog代码设计的过程中&#xff0c;经常会涉及到一些常用组件的应用&#xff0c;比如仲裁器、打拍器、RS双向打拍器等。这些组件如果重复开发就会降低效率。这些常用的组件业内称为CBB&#xff08;Common Building Block&#xff09;。本专栏旨在开发一些好用易用的CBB&…

前端拥抱AI:LangChain.js 入门遇山开路之PromptTemplate

PromptTemplate是什么 PromptTemplate是一个可重复使用的模板&#xff0c;用于生成引导模型生成特定输出的文本。与Prompt的区别: PromptTemplate相对于普通Prompt的优势&#xff0c;即其灵活性和可定制性。 简单了解PromptTemplate后&#xff0c;咱们就来聊聊LangChain里的P…

Linux配置FTP服务

一、FTP服务基本信息 FTP服务器&#xff1a;一种应用广泛且古老的互联网文件传输协议&#xff0c;主要用于文件的双向传输。 默认端口号&#xff1a;21 全称&#xff1a;vsftpd 二、搭建FTP服务 1.关闭防火墙和selinux&#xff08;若linux系统没有这两种功能&#xff0c;跳…

最大化性能:VPS 主机优化技巧

如何让您的VPS更高效。VPS(虚拟专用服务器)是扩展网站具备成本效益的托管选项之一&#xff0c;虽然整体性能不错&#xff0c;但大多数用户并不知道&#xff0c;一些基本的优化&#xff0c;例如更改默认设置和降低负载&#xff0c;可能会大大提高其网站的速度。本文将为您介绍一…

阿里云ossbrowser安装及使用

ossbrowser是阿里云官方提供的OSS图形化管理工具&#xff0c;提供类似Windows资源管理器的功能。 阿里云对象存储OSS&#xff08;Object Storage Service&#xff09;是一款海量、安全、低成本、高可靠的云存储服务&#xff0c;可提供99.9999999999%&#xff08;12个9&#xf…

运放开环增益,闭环增益,增益带宽积与频率的关系。压摆率对输出信号影响,TINA仿真验证

开环增益 运放开环增益AOL&#xff0c;运放负反馈形成固定放大倍数的闭环增益&#xff0c;形成的条件是建立在AOL无穷大”的基础之上&#xff0c;实际运放的AOL并不是无穷大&#xff0c;是和频率有关系的。 当AOL不是无穷大时候&#xff0c;虚短是不成立的。并且当AOL比较小的时…

算法日记day 27(回溯之N皇后|解数独)

一、N皇后 题目&#xff1a; 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n…

【C++】map|set|原理使用|multiset|multimap|operator[]|

目录 一&#xff0c;关联式容器 二&#xff0c;键值对 2.1为什么使用键值对 2.2make_pair() 三&#xff0c;STl关联容器 四&#xff0c;set 4.1模板参数 4.2默认构造 4.3使用 去重功能和自动排序 4.4增删查 insert find erase 五&#xff0c;multiset count e…

面试官:使用 xxl-job 怎样解决任务重叠问题?

大家好&#xff0c;我是君哥。今天分享批量任务的重叠问题。 面试官&#xff1a;聊聊你用过的任务调度框架&#xff1f; 我&#xff1a;目前任务调度框架的选择有很多&#xff0c;比如业内熟悉的 QuartZ&#xff0c;Spring Batch&#xff0c;xxl-job&#xff0c;以及新一代的…

从零到一:同城代驾系统源码开发全流程详解

本篇文章&#xff0c;小编将详细解析同城代驾系统源码开发的全流程&#xff0c;从需求分析到最终上线&#xff0c;帮助你从零到一构建完整的系统。 一、需求分析与市场调研 对于同城代驾系统&#xff0c;首先要明确的是目标用户群体&#xff0c;如城市白领、商务人士或家庭用…

文件操作与IO(上)

✨个人主页&#xff1a; 不漫游-CSDN博客 目录 一、认识文件 文件存储 文件路径 绝对路径 相对路径 文件种类 二进制文件 文本文件 文件系统操作 经典面试题 一、认识文件 想必文件大家都不陌生&#xff0c;文件是存储在计算机系统中的数据集合&#xff0c;它可以包…