数据结构-图的存储结构-邻接矩阵

        图的结构十分复杂,不仅各个结点的度不同,各个顶点之间的路径也不尽相同。但是图的主要组成部分比较清晰,分为顶点信息和边或者弧的信息。

        邻接矩阵

        邻接矩阵就是用一维数组存储图中顶点的信息,用一个二维数组表示图中各个顶点之间的邻接关系的信息,而这个二维数据就是邻接矩阵。

        假设图G=(V,E)n个确定的顶点,即V=(v_{0},v_{1},v_{2},...,v_{n-1}),则表示G中个顶点相邻关系为一个n\times n的矩阵,矩阵的元素为

A[i][j]=\left\{\begin{matrix} 1 & \\ 0 & \end{matrix}\right.

         其中,顶点ij之间有边或者弧时为1,顶点ij之间没有边或者弧时为0

        如果G是带权图,则有定义

A[i][j]=\left\{\begin{matrix} w_{ij} & \\ 0 & \\ \infty & \end{matrix}\right.

         其中,顶点ij之间有边或者弧且权值为w_{ij}时为w_{ij},对角线元素(i=j)为0,顶点ij之间没有边或者弧为\infty

 无向图的邻接矩阵表示

        邻接矩阵的特点

         (1)无向图的邻接矩阵一定是一个对称矩阵。因此再存储邻接矩阵时只需存储上或者下的三角矩阵的元素即可。有向图的邻接矩阵不一定时对称矩阵。

        (2)无向图的邻接矩阵的第i行(或第i列)非零元素(或非\infty元素)的个数正好是第i个顶点的度D(v_{i})

        (3)有向图的邻接矩阵的第i行(或第i列)非零元素(或非\infty元素)的个数正好是第i个顶点的出度OD(v_{i})(或入度ID(v_{i})

        (4)用邻接矩阵方法存储图,很容易确定图中任意两个顶点之间是否有边相连。要确定图中的边的个数,必须按行、列对每个元素进行检测。

        (5)邻接矩阵存储稀疏图会浪费时间和空间。所以邻接矩阵适合存储稠密图。

        邻接矩阵的存储算法

        邻接矩阵的表示

        由上面的定义得知在邻接矩阵的结构体中,不仅需要表示邻接矩阵的二维数组,还需要一个一维数组存储顶点信息。

const int M = 500;
typedef struct{        char ver[M];            //顶点表int edg[M];            //边表,即邻接矩阵int vernum,edgnum;     //顶点数和边数
}MGraph;

        邻接矩阵的创建

const int INF = 0x7f7f7f;void CreatG(MGraph *G)
{int ver1,ver2,w;scanf("%d%d",&(G->vernum),&(G->edgnum));    //输入顶点数和边数for(int i = 0;i<G->vernum;i++)scanf("%c",&(G->ver[i]));               //输入顶点信息,建立顶点表/*创建无向图的邻接矩阵*/memset(G->edg,0,sizeof (G->edg));           //初始化邻接矩阵                 for(int i = 0;i<G->edgnum;i++){scanf("%d%d",&ver1,&ver2);              //输入边,建立邻接矩阵G->edg[i][j] = 1;                       //无向图的邻接矩阵}/*创建带权图的邻接矩阵*/for(int i = 0;i<G->edgnum;i++)              //初始化邻接矩阵for(int j = 0;j<G->edgnum;j++){if(i == j)G->edg[i][j] = 0;elseG->edg[i][j] = INF;}for(int i = 0;i<G->edgnum;i++){scanf("%d%d%d",&ver1,&ver2,&w);         //输入边和权值,建立邻接矩阵G->edg[i][j] = w;                       //有权值图的邻接矩阵}
}

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

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

相关文章

java读取csv文件转换成实体类

java读取csv文件转换成实体类 java读取csv文件转换成实体类 java读取csv文件转换成实体类1、需求:2、使用opencsv实现2.1 添加OpenCSV依赖到你的项目中(如果使用Maven):2.2 定义你的实体类:2.3 创建一个CSV工具类,根据需要指定字符集编码格式2.4 编写测试类,读取CSV文件…

uni-app与原生插件混合开发调试1-环境准备

uni-app与原生插件混合开发调试系列文章分为3篇&#xff0c;分别详细讲了《环境准备》、《搭建uni-app本地开发调试环境》和《安卓原生插件开发调试和打包》&#xff0c;3篇文章完整详细地介绍了“从环境安装配置到本地开发调试到原生插件打包”整个流程。 相关名词和概念解释…

FuTalk设计周刊-Vol.026

&#x1f525;&#x1f525;AI漫谈 热点捕手&#x1f525;&#x1f525; 1、Hotshot-XL AI文本转GIF Hotshot-XL 是一种 AI 文本转 GIF 模型&#xff0c;经过训练可与Stable Diffusion XL一起使用。能够使用任何现有或新微调的 SDXL 模型制作 GIF。 网页体验 网页http://htt…

GET、POST介绍

POST地址构成 如&#xff1a;http://192.123.143.18:9666/image /predict 组成如下&#xff1a; http&#xff1a;使用http协议 IP地址/域名&#xff1a;192.123.143.18 port端口&#xff1a;9666&#xff08;http默认80端口、https默认443&#xff09; 服务名称&#xff1a;i…

智能体实战:开发一个集成国内AI平台的GPTs,自媒体高效智能助手

文章目录 一&#xff0c;什么是GPTs二&#xff0c;开发GPTs1&#xff0c;目标2&#xff0c;开发2.1 打开 GPTS&#xff1a;https://chat.openai.com/gpts2.2 点击 Create 创建一个自己的智能体 2.3 配置GPTs2.4 配置外挂工具2.4.1 配置Authentication-授权2.4.1.1 生成语聚AI的…

用FFmpeg合并音频和视频

使用FFmpeg合并音频和视频是一个相对直接的过程。可以通过以下一些基本的步骤和命令示例完成这个任务&#xff1a; 安装FFmpeg&#xff1a;首先&#xff0c;确保你的系统中已经安装了FFmpeg。你可以从[FFmpeg官网](Download FFmpeg)下载并安装它。 准备素材&#xff1a;确保你…

服务器重装系统后,远程ssh需要修改的内容

前提 首先实验室服务器内部是搭了内网的&#xff0c;所以有固定的IP,IP是和网卡的MAC地址有关的&#xff0c;所以和系统没有关系&#xff0c;所以更换了系统不会影响IP的。 修改内容 1、首先需要安装 SSH sudo apt install openssh-server2、之后需要修改ssh的配置参数 打…

Oracle day13

/*CREATE TABLE f726( ID number, Type VARCHAR2(20), MasterID number, Amount number ); INSERT INTO f726 VALUES (1,直接合同,NULL,5000); INSERT INTO f726 VALUES (2,补充合同,1,1000); INSERT INTO f726 VALUES (3,补充合同,1,500); INSERT INTO f726 VALUES (4,直接合同…

itsdangerous,一个强大的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个强大的 Python 库 - itsdangerous。 Github地址&#xff1a;https://github.com/pallets/itsdangerous 在Web应用开发中&#xff0c;数据的安全传输和存储是非常重要的。P…

服务器部署—虚拟机安装nginx并部署web网页

该篇博客用于讲解Linux的Centos7发行版中如何通过Linux安装Nginx&#xff0c;然后将静态页面部署到Nginx中&#xff0c;通过浏览器访问。 非常适用于新手小白学习项目部署相关的知识。建议收藏&#xff01;&#xff01;&#xff01; 需要大家提前准备好虚拟机和CentOS7操作系统…

python API自动化(基于Flask搭建MockServer)

接口Mock的理念与实战场景: 什么是Mock: 在接口中&#xff0c;"mock"通常是指创建一个模拟对象来代替实际的依赖项&#xff0c;以便进行单元测试。当一个类或方法依赖于其他类或组件时&#xff0c;为了测试这个类或方法的功能&#xff0c;我们可以使用模拟对象来替代…

企业级-生成PDF移除异常空白页

作者&#xff1a;fyupeng 技术专栏&#xff1a;☞ https://github.com/fyupeng 项目地址&#xff1a;☞ https://github.com/fyupeng/distributed-blog-system-api 留给读者 咱们又见面了&#xff0c;本期带给大家什么&#xff0c;请往下看&#xff0c;绝对是干货&#xff01; …

M4V文件损坏无法播放?一招轻松修复损坏视频文件!

M4V是一个标准视频文件格式&#xff0c;此种格式常在iPod 、 iPhone 和 PlayStation Portable等设备上使用&#xff0c;同时此格式基于MPEG-4编码第二版&#xff0c;是MP4格式的一种特殊类型&#xff0c;有时可能会因为各种原因而损坏&#xff0c;导致无法正常播放。M4V文件出现…

前端vue3 根据某些Id 筛选数据

现在有一些不等的数据 我需要通过前端 吧这个数据筛选一下 比如我使用一些 我需要的ID 下的数据 比如以上的数据 的 cinemaLineId 来筛选 const cinemaLineId ref(["1246429254713147392", "1182608813770321920", "1182608917403185152"])…

爬取必应关键字搜索结果url

上代码 import aiohttp import asyncio from lxml import etree import aiofiles import time import random aiohttp 和 asyncio 用于异步HTTP请求和事件循环。 lxml 用于解析HTML。 aiofiles 用于异步文件操作。 time 和 random 用于控制爬取速度。 headers {User-Agent: M…

frida的安装使用以及解决抓包app时遇到的证书校验

frida的安装和使用 这里使用夜神模拟器来演示frida的使用&#xff0c;因为真机开启frida-server服务时需要root权限,模拟器自带root 下载夜神模拟器并启动 夜神官网 打开power shell&#xff0c; adb连接模拟器&#xff0c;查看模拟器的系统型号 adb connect 127.0.0.1:6200…

阿里云centos7.9 挂载数据盘 并更改宝塔站点根目录

一、让系统显示中文 参考&#xff1a;centos7 怎么让命令行显示中文&#xff08;英文-&#xff1e;中文&#xff09;_如何在命令行中显示中文-CSDN博客 1、输入命令&#xff1a;locale -a |grep "zh_CN" 可以看到已经存在了中文包 2、输入命令&#xff1a;sudo vi…

SecureCRT使用SSH登录服务器报错:Key exchange failed

SecureCRT使用SSH登录Ubuntu服务器报错&#xff1a;Key exchange failed 原因&#xff1a; ssh客户端与服务器的公钥协商失败&#xff0c;SecureCRT客户端所指定的秘钥交换算法&#xff08;KexAlgorithms &#xff09;&#xff0c;不在服务端支持范围内。可能是服务端的sshd版…

学习笔记(linux高级编程)7

2._exit 系统调用 void _exit(int status); 功能: 让进程退出,不刷新缓存区 参数: status:进程退出状态 返回值: 缺省 回调函数 3.atexit int atexit(void (*function)(void)); 功能: 注册进程退出前执行的函数 参数: function:函数指针 指向void返回值void参数的函数指针 返…

C++ | Leetcode C++题解之第188题买卖股票的最佳时机IV

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxProfit(int k, vector<int>& prices) {if (prices.empty()) {return 0;}int n prices.size();k min(k, n / 2);vector<int> buy(k 1);vector<int> sell(k 1);buy[0] -prices[0]…