数据--第40课 - 图的定义
第40课 - 图的定义
1. 定义
图是由定点集合(Vertex)以及顶点间的关系集合组成的一种数据结构:Graph = (V, E)
V = { x|x属于某个数据对象}是顶点的有穷费控集合;E = {(x,y)|x,y属于V }是顶点之间关系的有穷集合,也叫做边(Edge)集合。
2. 图的定义
(1)无向边
若顶点x和y之间的边没有方向,则称该边为无向边(x,y)。
(x,y)与(y,x)意义相同,表示x和y之间有联系。
(2)无向图
若图中任意两个顶点之间的边均是无向边,则称该图为无向图。
(3)有向边
若顶点x和y之间有向边,责成该边为有向边<x,y>
<x,y>与<y,x>意义不同,表示从x连接到y,x称为尾,y称为头。
(4)有向图
若图中任意两个顶点之间的边均是有向边,则称改图为有向图。
(5)度(Degree)的定义
顶点v度是和v相关联的边的数目,记为TD(v)。
入度:以v为头的边的数目,记为ID(v)。
出度:以v为尾的边的数目,记为OD(v)。
很显然:
TD(v) = ID(v) + OD(v)
E = [TD(v1) + TD(v2) + … + TD(vn)] / 2
E = ID(v1) + ID(v2) + … + ID(vn)
E = OD(v1) + OD(v2) + … + OD(vn)
(6)权(Weight)的定义
与图相关的数字叫做权,权常用来表示图中顶点之间的距离或者耗费。
3. 图的操作
l 创建图
l 销毁图
l 清空图
l 加入边
l 删除边
l 获取权
l 获取结点的度
l 获取图的结点数
l 获取图的边数
4. 图操作的实现
图在程序中表现为一种特殊的数据类型。
图的操作在程序中的表现为一组函数。
Graph* Graph_Create(int n);
void Graph_Destroy(Graph* graph);
void Graph_Clear(Graph* graph);
int Graph_AddEdge(Graph* graph, int v1, int v2, int w);
int Graph_RemoveEdge(Graph* graph, int v1, int v2);
int Graph_GetEdge(Graph* graph, int v1, int v2);
int Graph_TD(Graph* graph, int v);
int Graph_VertexCount(Graph* graph);
int Graph_EdgeCount(Graph* graph);
5. 程序—C语言描述图的结构
main.c
#include <stdio.h>
#include <stdlib.h>
#include "Graph.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[])
{
Graph* graph = Graph_Create(5);
Graph_AddEdge(graph, 0, 1, 1);
Graph_AddEdge(graph, 1, 0, 1);
Graph_Destroy(graph);
return 0;
}
Graph.h
#ifndef _GRAPH_H_
#define _GRAPH_H_
typedef void Graph;
typedef void Vertex;
/* 创建并返回有n个顶点的图 */
Graph* Graph_Create(int n);
/* 销毁graph所指向的图 */
void Graph_Destroy(Graph* graph);
/* 将graph所指图的边集合清空 */
void Graph_Clear(Graph* graph);
/* 在graph所指图中的v1和v2之间加上边,且边的权为w */
int Graph_AddEdge(Graph* graph, int v1, int v2, int w);
/* 将graph所指图中v1和v2之间的边删除,返回权值 */
int Graph_RemoveEdge(Graph* graph, int v1, int v2);
/* 将graph所指图中v1和v2之间的边的权值返回 */
int Graph_GetEdge(Graph* graph, int v1, int v2);
/* 将graph所指图中v顶点的度数 */
int Graph_TD(Graph* graph, int v);
/* 将graph所指图中的顶点数返回 */
int Graph_VertexCount(Graph* graph);
/* 将graph所指图中的边数返回 */
int Graph_EdgeCount(Graph* graph);
#endif
Graph.c
#include <malloc.h>
#include "Graph.h"
Graph* Graph_Create(int n)
{
return NULL;
}
void Graph_Destroy(Graph* graph)
{
}
void Graph_Clear(Graph* graph)
{
}
int Graph_AddEdge(Graph* graph, int v1, int v2, int w)
{
return 0;
}
int Graph_RemoveEdge(Graph* graph, int v1, int v2)
{
return 0;
}
int Graph_GetEdge(Graph* graph, int v1, int v2)
{
return 0;
}
int Graph_TD(Graph* graph, int v)
{
return 0;
}
int Graph_VertexCount(Graph* graph)
{
return 0;
}
int Graph_EdgeCount(Graph* graph)
{
return 0;
}
小结:
图是一种扩展的树的结构,每个结点可一直想任意的其他的结点。
链表示特殊的树结构,树是特殊的图结构。
图这种数据结构常用语网络规划和路径规划等领域。
GPS相关产品中大量应用了图的结构和图的算法。
转载于:https://www.cnblogs.com/free-1122/p/11336067.html
数据--第40课 - 图的定义相关推荐
- 40张图+万字,从9个数据类型帮你稳稳的拿捏Redis数据结构
摘要:本文把Redis新旧版本的数据结构说图解一遍,共有 9 种数据结构:SDS.双向链表.压缩列表.哈希表.跳表.整数集合.quicklist.listpack. 本文分享自华为云社区<为了拿 ...
- python逐笔输入数据_知到智慧树Python数据分析与数据可视化结课测验
知到智慧树Python数据分析与数据可视化结课测验答案 更多相关问题 已知三角形三个顶点的坐标是A(-1,2,3),B(1,1,1),C(0,0,5),试证三角形ABC是直角三角形,并求角B-- Wh ...
- python读取nc文件数据生成专业气象图
python读取nc文件数据生成专业气象图如色斑图.等值线.风向标,如下图所示: 代码如下: # -*- coding: utf-8 -*- """ Created on ...
- 详解Arduino Uno开发板的引脚分配图及定义
详解Arduino Uno开发板的引脚分配图及定义(重要且基础) https://www.cnblogs.com/Bruce_H21/p/11555605.html 首先开发板实物图如下: 在本篇文章 ...
- 图(1)——图的定义和基本概念
2019独角兽企业重金招聘Python工程师标准>>> 概述 图(Graph)是一种比线性表和树更为复杂的数据结构. 线性结构:是研究数据元素之间的一对一关系.在这种结构中,除第一个 ...
- c++ 遍历所有点且距离最短_L3图论第08课 图的遍历
L3-图论-第08课 图的遍历 图的遍历是指,从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历.遍历过程中得到的顶 ...
- window.addeventlistener 不能调用方法_Java入门第十四课:如何定义”方法“
第十四课,学习定义方法.一个对象包含三种最常见的成员:构造器.Field和方法.Field用于定义状态数据,而方法是行为特征的抽象. 那么什么是方法呢? 在Java中,方法就是用来完成解决某件事情或实 ...
- 图的定义与术语 - 数据结构和算法54
图的定义与术语 让编程改变世界 Change the world by program 在前边讲解的线性表中,每个元素之间只有一个直接前驱和一个直接后继,在树形结构中,数据元素之间是层次关系,并且 ...
- Echarts数据可视化series-radar雷达图,开发全解+完美注释
全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...
- Echarts数据可视化series-line线图,开发全解+完美注释
全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...
最新文章
- BZOJ 3930 [CQOI2015]选数
- Application package 'AndroidManifest.xml' must have a minimum of 2 segments错误
- 【C语言进阶深度学习记录】四 C语言中的类型转换
- python循环post请求_循环post请求太多
- 都啥年代了,求你别再说Redis是单线程了!
- ABAP基础篇-语法-数据类型
- Python 使jupyter notebook 从指定浏览器启动 以及编程中途更换浏览器
- 彩虹色MD主题1 for Sublime Text Typora EmEditor EverEdit
- window location href is not a function错误解决
- rl滤波器原理_入门篇,层层讲解滤波电路工作原理
- 华为nova青春版是html手机吗,华为Nova青春版这款手机作为新青年良品:麒麟935+4G+64GB+18W快充...
- 2015年校园招聘12家IT公司面试体验
- CAD批量画八边形风机基础平台
- 视频直播网站开发的最佳实践
- 使用poi导出excel生成复杂多级表头通用方法
- CSS设置图像的透明度
- 软件测试-制定测试策略
- frp代理工具流量分析
- Android 调整进程的最大fd 数目
- pythonfind_Python find()方法:检测字符串中是否包含某子串
热门文章
- java线程volatile_多线程与高并发(四)volatile关键字
- Dubbo 是如何控制并发数和限流的?
- html盒子中盒子排列,解析CSS的box model盒模型及其内的子元素布局控制
- 清除html中table标签显示的数据,遍历查看/新增/删除/获取html中table中的标签
- android 保留edittext中的文字不被后面添加的文字覆盖_【Go语言绘图】图片添加文字(一)...
- dch中mysql作用_解析Cloudera Manager内部结构、功能包括配置文件、目录位置等
- python创建gui界面_你要的 Python 创建 GUI 用户界面程序,来咯
- python开发环境有哪些_python开发环境哪个好用?如何搭建?
- java map clone,map.putall()和map.clone()方法有什么区别?
- sql developer下载_开放下载!《Rocket MQ 使用排查指南》精解100+常见问题