第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课 - 图的定义相关推荐

  1. 40张图+万字,从9个数据类型帮你稳稳的拿捏Redis数据结构

    摘要:本文把Redis新旧版本的数据结构说图解一遍,共有 9 种数据结构:SDS.双向链表.压缩列表.哈希表.跳表.整数集合.quicklist.listpack. 本文分享自华为云社区<为了拿 ...

  2. python逐笔输入数据_知到智慧树Python数据分析与数据可视化结课测验

    知到智慧树Python数据分析与数据可视化结课测验答案 更多相关问题 已知三角形三个顶点的坐标是A(-1,2,3),B(1,1,1),C(0,0,5),试证三角形ABC是直角三角形,并求角B-- Wh ...

  3. python读取nc文件数据生成专业气象图

    python读取nc文件数据生成专业气象图如色斑图.等值线.风向标,如下图所示: 代码如下: # -*- coding: utf-8 -*- """ Created on ...

  4. 详解Arduino Uno开发板的引脚分配图及定义

    详解Arduino Uno开发板的引脚分配图及定义(重要且基础) https://www.cnblogs.com/Bruce_H21/p/11555605.html 首先开发板实物图如下: 在本篇文章 ...

  5. 图(1)——图的定义和基本概念

    2019独角兽企业重金招聘Python工程师标准>>> 概述 图(Graph)是一种比线性表和树更为复杂的数据结构. 线性结构:是研究数据元素之间的一对一关系.在这种结构中,除第一个 ...

  6. c++ 遍历所有点且距离最短_L3图论第08课 图的遍历

    L3-图论-第08课 图的遍历 图的遍历是指,从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历.遍历过程中得到的顶 ...

  7. window.addeventlistener 不能调用方法_Java入门第十四课:如何定义”方法“

    第十四课,学习定义方法.一个对象包含三种最常见的成员:构造器.Field和方法.Field用于定义状态数据,而方法是行为特征的抽象. 那么什么是方法呢? 在Java中,方法就是用来完成解决某件事情或实 ...

  8. 图的定义与术语 - 数据结构和算法54

    图的定义与术语 让编程改变世界 Change the world by program   在前边讲解的线性表中,每个元素之间只有一个直接前驱和一个直接后继,在树形结构中,数据元素之间是层次关系,并且 ...

  9. Echarts数据可视化series-radar雷达图,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  10. Echarts数据可视化series-line线图,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

最新文章

  1. BZOJ 3930 [CQOI2015]选数
  2. Application package 'AndroidManifest.xml' must have a minimum of 2 segments错误
  3. 【C语言进阶深度学习记录】四 C语言中的类型转换
  4. python循环post请求_循环post请求太多
  5. 都啥年代了,求你别再说Redis是单线程了!
  6. ABAP基础篇-语法-数据类型
  7. Python 使jupyter notebook 从指定浏览器启动 以及编程中途更换浏览器
  8. 彩虹色MD主题1 for Sublime Text Typora EmEditor EverEdit
  9. window location href is not a function错误解决
  10. rl滤波器原理_入门篇,层层讲解滤波电路工作原理
  11. 华为nova青春版是html手机吗,华为Nova青春版这款手机作为新青年良品:麒麟935+4G+64GB+18W快充...
  12. 2015年校园招聘12家IT公司面试体验
  13. CAD批量画八边形风机基础平台
  14. 视频直播网站开发的最佳实践
  15. 使用poi导出excel生成复杂多级表头通用方法
  16. CSS设置图像的透明度
  17. 软件测试-制定测试策略
  18. frp代理工具流量分析
  19. Android 调整进程的最大fd 数目
  20. pythonfind_Python find()方法:检测字符串中是否包含某子串

热门文章

  1. java线程volatile_多线程与高并发(四)volatile关键字
  2. Dubbo 是如何控制并发数和限流的?
  3. html盒子中盒子排列,解析CSS的box model盒模型及其内的子元素布局控制
  4. 清除html中table标签显示的数据,遍历查看/新增/删除/获取html中table中的标签
  5. android 保留edittext中的文字不被后面添加的文字覆盖_【Go语言绘图】图片添加文字(一)...
  6. dch中mysql作用_解析Cloudera Manager内部结构、功能包括配置文件、目录位置等
  7. python创建gui界面_你要的 Python 创建 GUI 用户界面程序,来咯
  8. python开发环境有哪些_python开发环境哪个好用?如何搭建?
  9. java map clone,map.putall()和map.clone()方法有什么区别?
  10. sql developer下载_开放下载!《Rocket MQ 使用排查指南》精解100+常见问题