图的相关种类

目录

数据类型

存储结构

邻接矩阵表示法

无向图

邻接矩阵表示

有向图

实现

邻接矩阵表示

存储结构

创建无向图

优点

缺点

邻接表法表示

表示无向图

表示有向图

存储结构

无向网

特点

十字链表与多重表

十字链表

存储结构

多重表

存储结构


数据类型

存储结构

邻接矩阵表示法

无向图

无向图的度=矩阵中非0元素个数和的一半 

邻接矩阵表示

有向图

因此,有向图的度为矩阵中非0元素个数总和

实现

邻接矩阵表示

存储结构

创建无向图

优点

缺点

邻接表法表示

表示无向图

表示有向图

示例

存储结构

先表示出所有边结点,再将边结点组成链表连接到各个对应顶点上。

示例

无向网

特点

十字链表与多重表

十字链表

为解决有向图求度不方便的问题

存储结构

firstin表示以data为弧头(终点,即指向data顶点-入)的边,firstout表示以data为弧尾(起点-出)的边。

tailvex表示弧的弧尾(起点)顶点序号,headvex表示弧的弧头(终点)顶点序号,

hlink指向下一个弧头相同的弧,tlink指向下一个弧尾相同的弧。

先列出所有弧,再连接到顶点。

多重表

存储结构

相关代码

#include <iostream>
using namespace std;
//图的存储

//1.邻接矩阵存储:边数+顶点数+顶点表-一维+边表-二维
#define maxn 20
#define infi 33333333 
//类型定义 
typedef struct {
	char vexs[maxn];//顶点表 
	int arc[maxn][maxn];//边表 
	int vexnum,arcnum;//顶点数与边数 
}adjgraph;
//创建无向图
//1.输入边数与顶点数,初始边表-无穷 
//2.输入顶点,为顶点表赋值 
//3.输入边的顶点及权值,为边表赋值:需要先确定顶点的下标才能确定边 
int getvex(adjgraph *g,char v){
	for(int i=1;i<=g->vexnum;i++)
		if(g->vexs[i]==v) return i;
	return 0;
}
//后期实现!!!! 
//void print(adjgraph *g){
//	for(int i=1;i<=g->vexnum;i++)
//		if(g->vexs[i]==v) return i;
//} 
void create(adjgraph *g){
	char vex1,vex2;//存储边的顶点 
	int weigh;//存储边的权值 
	int  v1,v2;//存储边的下标 
	cout<<"输入顶点数及边数:"<<endl;
	cin>>g->vexnum>>g->arcnum;
	for(int i=1;i<=g->vexnum;i++){//初始边表 
		for(int j=1;j<=g->arcnum;j++){
			g->arc[i][j]=infi;
    	} 
	}
    for(int i=1;i<=g->vexnum;i++){//存储顶点信息 
    	cout<<"请输入第"<<i<<"个顶点信息:\n";
    	cin>>g->vexs[i];
    }
    for(int j=1;j<=g->arcnum;j++){//存储边表信息 
    	cout<<"请输入第"<<j<<"条边的顶点信息:\n";
    	cin>>vex1>>vex2;
    	cout<<"请输入第"<<j<<"条边的权值:\n";
    	cin>>weigh;
    	v1=getvex(g,vex1);
    	v2=getvex(g,vex2);
    	g->arc[v1][v2]=weigh;//单向
		g->arc[v2][v1]=weigh;//双向-无向图 
	}
}

//2.邻接表表示:顶点表+顶点数+边数 
//顶点表:顶点信息+第一条边结点
//边结点:顶点编号+边权+下一条边
int getvex2(adjlist &g,char v){
	for(int i=1;i<=g.vnum;i++)
		if(g.vex[i].vex==v) return i;
	return 0;
}
typedef struct acrnode{//边结点 
	int adjacr;//记录邻接顶点编号-弧尾 
	int weigh;//权值 
	acrnode *next;//有相同弧头顶点的下一个边结点 
}acrnode; 
typedef struct vnode{//顶点类型 
	char vex;
	acrnode *first;
}vnode; 
typedef struct {//邻接表 
	int vnum,acrnum;
	vnode vex[maxn];//顶点表 
}adjlist;
void create(adjlist &g){
	char v1,v2;
	int  vex1,vex2;
	acrnode n,m; 
	//1.输入顶点数、边数
	cin>>g.vnum>>g.acrnum; 
	//2.初始邻接表:输入顶点,初始顶点表头指针为空
	for(int i=1;i<=g.vnum;i++){
		cin>>g.vex[i].vex;
		g.vex[i].first=NULL;
	}
	//3.输入边顶点,构造边结点,记录弧头与弧尾顶点,头插边表
	for(int i=1;i<=g.acrnum;i++){
		cin>>v1>>v2;
		vex1=getvex2(g,v1);//弧尾 
		vex2=getvex2(g,v2);//弧头
		n=new acrnode;//构造边结点
		//记录边v1->v2; 并插入到顶点v1的边表中 
		n->adjacr=vex2;//存储邻接v1的顶点v2的编号 
		n->next=g.vex[vex1].first;//下一个边结点存储原来v1顶点的第一个边结点
		g.vex[vex1].first=n;//更新v1顶点的第一条边为n,实现插入 
		//记录边v2->v1:新边结点结构-左边记录邻接指点编号  权值   右边记录具有同样以v2为弧尾的下一条边结点 
		m=new acrnode;
		m->adjacr=vex1;//记录邻接v2的顶点v1的编号
		m->next=g.vex[vex2].first;//下一个边结点存储v2指向的第一个边结点 
		g.vex[vex2].first=m;//更新顶点v2的第一条边结点,实现插入 
	} 
}

//3.十字链表表示:弧结点+顶点结点==>顶点表+弧数+顶点数-解决有向图找出入度的问题
//弧结点 
typedef struct acrnode{
	int tailvex,headvex;//弧头+弧尾编号
	struct acrnode *tailacr,*headacr;//分别具有相同弧头和弧尾的下一条弧结点 
}arcnode;
typedef struct vexnode{
	char data;//顶点信息 
	acrnode *tail,*head;//以顶点为弧尾或为弧头的弧结点 
}vexnode; 
typedef struct node{
	int vnum,acrnum;
	vexnode v[maxn];
};

//4.多重表:顶点结点+边结点==>顶点表+边数+顶点数-解决无向图重复存边的问题
typedef struct acrnode{
	int tailvex,headvex;//组成边结点的两顶点编号 
	struct acrnode *tailacr,*headacr;//与边结点顶点相同的边结点 
	int weigh;//边的权重 
}; 
//顶点结点:顶点信息+指向第一条边的指针 
typedef struct vexnode{
	char data;
	acrnode *first;//第一条边结点 
}; 
typedef struct node{
	int vnum,vacr;
	vexnode v[maxn];//顶点表 
}; 
int main(){
	adjgraph g;
	create(&g);
	return 0;
} 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python-找素数

[题目描述] 小明刚刚学习了素数的概念&#xff1a;如果一个大于 11 的正整数&#xff0c;除了 11 和它自身外&#xff0c;不能被其他正整数整除&#xff0c;则这个正整数是素数。现在&#xff0c;小明想找到两个正整数 A 和 B 之间&#xff08;包括 A 和 B&#xff09;有多少个…

软件管理、rpm安装、yum安装、源码编译安装

目录 一、Windows安装/卸载 二、软件的卸载&#xff1a; 三、Linux的软件安装和卸载 3.1rpm安装 第一步&#xff1a;挂在光盘 第二步&#xff1a;查看/mnt 第三步&#xff1a;切换到/mnt/Packages 第四步&#xff1a;安装 3.2yum安装&#xff08;使用关盘作为yum源&…

UDP协议在物联网中的实战

一、UDP协议介绍 UDP(User Datagram Protocol, 用户数据报协议)&#xff0c;无连接的传输层协议&#xff0c;提供面向事务的简单不可靠信息传输服务。强调传输性能而不是传输完整性&#xff0c;多用于视频和多媒体应用。 2.1 报文格式 2.2 协议特点 无连接&#xff1a;不可靠传…

LangChain开发【NL2SQL】应用(few-shot优化)

前言 之前发布的博客LangGraph开发Agent智能体应用【NL2SQL】-CSDN博客&#xff0c;留了一个问题&#xff0c;对于相对复杂的sql&#xff08;leetcode中等难度的sql题&#xff09;&#xff0c;gpt4o就力不从心了。这篇文章来讲一下优化 什么是few-shot 使用这些少量的、调整…

MI-SegNet: 基于互信息的超越领域泛化的超声图像分割

文章目录 MI-SegNet: Mutual Information-Based US Segmentation for Unseen Domain Generalization摘要方法实验结果 MI-SegNet: Mutual Information-Based US Segmentation for Unseen Domain Generalization 摘要 针对医学图像分割在不同领域间泛化能力有限的问题,特别是针…

【uniapp】带圆角渐变边框实现

1. 效果图 2. 代码实现 <image class"item-left-img" :src"url" mode"aspectFill" />.item-left-img {width: 240rpx;height: 320rpx;border: 6rpx solid transparent;background-clip: padding-box, border-box;background-origin: padd…

Magnet pro for mac v2.14.0中文激活版:高效窗口管理工具

Magnet for Mac是一款专为Mac用户设计的窗口管理工具&#xff0c;旨在帮助用户更高效地管理和布局多个应用程序窗口&#xff0c;提升工作效率。 Magnet pro for mac v2.14.0中文激活版下载 这款软件拥有直观易用的界面和丰富的功能&#xff0c;支持用户将屏幕分割成多个区域&a…

浅浅写一个Word、PowerPoint、Excel文档转PDF工具

前言 最近在搞知识库&#xff0c;需要把各种 Word、PowerPoint、Excel 文件转换成 PDF 文件&#xff0c;不然 Word 中的表格中的文字提取会出现一些问题&#xff1b;使用 Office 或者 WPS 将大量文件转换成 PDF 需要频繁重复打开文件&#xff0c;点击保存为PDF&#xff0c;然后…

yg校园易购电商系统(Go+Vue)

校园易购二手平台系统 GitHub项目地址&#xff1a;https://github.com/xzhHas/yg 文章目录 校园易购二手平台系统一、技术栈简介二、快速开始1、安装本系统使用到的插件&#xff0c;这里推荐使用docker安装&#xff0c;此操作皆在ubuntu系统下操作&#xff0c;如果是其他系统只…

5. MySQL 运算符和函数

文章目录 【 1. 算术运算符 】【 2. 逻辑运算符 】2.1 逻辑非 (NOT 或者 !)2.2 逻辑与运算符 (AND 或者 &&)2.3 逻辑或 (OR 或者 ||)2.4 异或运算 (XOR) 【 3. 比较运算符 】3.1 等于 3.2 安全等于运算符 <>3.3 不等于运算符 (<> 或者 !)3.4 小于等于运算符…

NXdfefefef

prototype&#xff1a;原型 CORS(Cross-Origin Resource Sharing):跨资源共享 Interceptor&#xff1a;拦截器 BOM&#xff1a;Browser Object Module(浏览器对象模型) Ajax(Asynchronous Javascript And XML)&#xff1a;异步的JavaScript和XML&#xff0c;Ajax其实就是浏览器…

Next.js Tailwind CSS UI组件

摘要&#xff1a; 官网 今天公司使用到一个前端ui框架——Next.js Tailwind CSS UI组件&#xff01;这从头构建一个AI驱动的前端UI组件生成器&#xff0c;生成Next.js Tailwind CSS UI组件&#xff1a; 1、用Next.js、ts和Tailwind CSS构建UI组件生成器Web应用程序。 2、用Copi…

从云端到终端:青犀视频汇聚/融合平台的视频接入方式与场景应用

一、青犀视频汇聚/融合平台 由TSINGSEE青犀视频研发的EasyCVR智能融合/视频汇聚平台基于“云-边-端”一体化架构&#xff0c;支持视频汇聚、融合管理&#xff0c;兼容多协议&#xff08;GA/T1400/GB28181/Onvif/RTSP/RTMP/海康SDK/Ehome/大华SDK/宇视SDK等&#xff09;、多类型…

床上用品消费新趋势,沃尔玛跨境卖家应关注哪些要点?

在当前的市场环境下&#xff0c;床上用品消费呈现出了一系列新趋势&#xff0c;这对于美国沃尔玛跨境卖家而言&#xff0c;既是挑战也是机遇。床上用品消费的新趋势为美国沃尔玛跨境卖家带来了诸多启示。 从当前的市场动态中&#xff0c;我们可以提炼出以下几个关键的要点&…

鸿蒙轻内核M核源码分析系列十七(2) 异常钩子函数的注册操作

本文中所涉及的源码&#xff0c;以OpenHarmony LiteOS-M内核为例&#xff0c;均可以在开源站点https://gitee.com/openharmony/kernel_liteos_m 获取。鸿蒙轻内核异常钩子模块代码主要在components\exchook目录下。异常钩子函数的注册、解注册、异常钩子类型定义在utils\los_de…

PaddleSpeech MFA:阿米娅中文音色复刻计划

PaddleSpeech&#xff1a;阿米娅中文音色复刻计划 本篇项目是对iterhui大佬项目[PaddleSpeech 原神] 音色克隆之胡桃的复刻&#xff0c;使用的PaddleSpeech的版本较新&#xff0c;也针对新版本的PaddleSpeech做了许多配置之上的更新并加入了自己对语音的对齐、配置、训练其它任…

Javascript全解(基础篇)

语法与数据类型 语法 var\let\const var 声明一个变量&#xff0c;可选初始化一个值。 let 声明一个块作用域的局部变量&#xff0c;可选初始化一个值。 const 声明一个块作用域的只读常量。 用 var 或 let 语句声明的变量&#xff0c;如果没有赋初始值&#xff0c;则其值为 …

毫米波雷达深度学习技术-1.6目标识别1

1.6 目标识别 利用检测和跟踪在距离、多普勒和角度这两个维度中的任意一个进行精确的目标定位后&#xff0c;将检测到的目标分类到所需的类别中。与检测类似&#xff0c;提出了多种框架来同时使用图像和点云进行目标分类。使用图像进行目标分类的最常见方法是从检测到的目标特征…

k8s:优雅关闭pod的简单例子

先通过Dockerfile创建一个image vim Dockerfie <<<< 内容如下&#xff1a; FROM centosRUN sed -i -e "s|mirrorlist|#mirrorlist|g" /etc/yum.repos.d/CentOS-* RUN sed -i -e "s|#baseurlhttp://mirror.centos.org|baseurlhttp://vault.centos.o…

不要当网管,网管得会静态路由和路由表

1、路由表 路由表的组成 路由表由多个路由条目组成&#xff0c;每个条目通常包含以下信息&#xff1a; 目的地网络&#xff08;Destination Network&#xff09;&#xff1a; 这是数据包要到达的目标网络地址&#xff0c;通常以CIDR&#xff08;无类别域间路由&#xff09;格…