zoukankan      html  css  js  c++  java
  • 数据--第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相关产品中大量应用了图的结构和图的算法。

  • 相关阅读:
    Keras安装
    sql根据查询顺序返回结果
    @Configuration @Bean
    SQL高级优化系列
    数据结构与算法系列(二)-- 算法
    数据结构与算法系列(一)-- 数据结构
    Golang中Label的用法
    日志收集系统系列(五)之LogTransfer
    日志收集系统系列(四)之LogAgent优化
    日志收集系统系列(三)之LogAgent
  • 原文地址:https://www.cnblogs.com/free-1122/p/11336067.html
Copyright © 2011-2022 走看看