数据--第40课 - 图的定义
Posted free-锻炼身体
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据--第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相关产品中大量应用了图的结构和图的算法。
以上是关于数据--第40课 - 图的定义的主要内容,如果未能解决你的问题,请参考以下文章