第31节 图的定义

-------------------------------------资源来源于网络,仅供自学使用,如有侵权,联系我必删.

第一:

图的定义

?  定义

  图是由顶点集合(Vertex) 及顶点间的关系集合组成的一种数据结构 :

                                    Graph = ( V   E ) 

V = { x | x ∈ ∈  某个数据对象 }  是顶点的有穷非空集合 ;

E = { (x, y) | x, y ∈ ∈ V }  是顶点之间关系的有穷集合 , 也叫做边(Edge) 集合

 

第二:

?  无向边

?  若顶点 x  和 和 y  之间的边没有方向 , 则称该边为无向边(x, y)
? (x, y)  与 与 (y, x)  意义相同 , 表示 x  和 和 y 

? 无向图

若图中任意两个顶点之间的边均是无向边 ,

 

?  有向边
    若顶点 x  和 和 y  之间的边有方向 , 则称该边为有向边<x, y>
   <x, y>  与 与 <y, x>  意义不同 , 表示从 x  连接到 y ,x  称为尾,y 称为头

?  有向图
?  若图中任意两个顶点之间的边均是有向边 ,则称该图为有向图

 

第三:

?   度 (Degree) 的定义
    顶点 v  和 的度是和 v  相关联的边的数目 , 记为TD(v)
•  入度 : 以 以 v  为头的边的数目 , 记为ID(v)
•  出度 : 以 以 v  为尾的边的数目 , 记为OD(v)

很显然 :
TD(v) = ID(v) + OD(v)
E = [TD(v 1 ) + TD(v 2 ) + … + TD(v n )] / 2
E = ID( v 1 ) + ID(v 2 ) + … + ID(v n )

E = OD(v 1 ) + OD(v 2 ) + … + OD(v n )

 

?  权 (Weight) 的定义

?  与图的边相关的数字叫做权
•  权常用来表示图中顶点间的距离或者耗费

 

第四:

? 图的一些常用操作
       创建图
       销毁图
       清空图
       加入边
       删除边
       获取权
       获取结点的度
      获取图的结点数
      获取图的边数

 

  图在程序中表现为一种特殊的数据类型

  图的操作在程序中的表现为一组函数

 

第五:

用C 语言描述图结构


#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
#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;
}
#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;
}

 

小结

?  图是一种扩展的树结构 , 每个结点可以指向任意的其它结点
?  链表是特殊的树结构 , 树是特殊的图结构
?  图这种数据结构常用于网络规划和路径路径规划等领域

GPS 相关产品中大量应用了图结构和图算法 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值