数据结构与算法(八)图的基本概念和顺序存储

图的概念

顶点:单位元素数据

边:连接顶点的线段

度:一个节点有几个临界点

顺序存储:1.邻接矩阵,2.边集数组

链式存储:1.邻接表,2.链式前向星

顺序存储

邻接矩阵

邻接矩阵:

1.使用一个维数字组存储图中所有顶点的信息

2.使用一个二维数组存储途中顶点之间的邻接关系

图分为无向图,有向图,带权图(也叫网)

无向图的边是双向的,没有箭头朝向,但两顶点同时相互指向

有向图的边是单向的,有箭头朝向,两顶点可以相互指向

带权图,在优先图的基础上,每个边都有一个权限

无向图

arr[] = {a, d, c, b}  0 1 2 3 存储顶点信息

M[i][j] = M[j][i] = 1

否则M[i][j] = 0

M二维数组 [i][j],i j为两个顶点

二维数组的构成:由一维数组决定,即顶点决定。

如上图,有四个顶点,则行列4*4的二维数组,数组坐标由0 1 2 3决定

存储AD的边:A是0,D是1,则0行1列记为1

存储DA的边:D是1,A是0,则1行0列记为1

同理可得AB AC等等的二维数组中的位置即数值

AA BB CC DD在二维数组中值记为0

由此方法,构造一个二维数组去存储边的关系

在此数组基础下,每一行都代表着一个顶点连接其他边的关系

也可发现,该数组关于对角线对称,由于双向边

无向图的度:二维数组每一行数值之和

有向图

arr[] = {a, b, c, d, e} 0 1 2 3 4

一个5*5的二维数组

有向图的度分为入度和出度:

入度:二维数组列的总和,即指向该节点的线段数之和

出度:二维数组行的总和,即该节点指向其他节点线段数之和

M[i][j] = 1,两顶点之间的有向线段

否则M[i][j] = 0,两顶点没有有向线段

存储AB的边:A是0,B是1,则0行1列记为1

存储AE的边:A是0,E是4,则0行4列记为1

存储EB的边:E是4,B是1,则4行1列记为1

如上同理,得出其他边在二维数组的位置及数值,其余的记为0,即没有指向的边

带权图

数据结构与算法(八)图的基本概念和顺序存储_第1张图片

arr[] = {a, b, c, d, e} 0 1 2 3 4

M[i][j] = w(权)

M[i][j] = ∞,在实际变编程中,选择一个极大值如0xFFFFFFFF,当作无穷

存储AB的边:A是0,B是1,权是5,则0行1列记作5

存储AE的边:A是0,E是4,权是9,则0行4列记作9

如上同理,得出其他边在二维数组的位置及数值,其余的记为0xFFFFFFFF

邻接矩阵代码实现

const int maxnode = 1000; 设置一个最大节点数

int arr[maxnode][maxnode]; 设置一个邻接矩阵二维数组

int nCount; 实际节点数

int edge; 实际边数

void Create()

{

    int nStart = 0; 启动位置

    int nEnd = 0; 结束位置

    std::cin >> nCount >> Edge; 设置实际节点数和边数

    for(size_t i = 0; i< nCount; i++)

    {

        for(size_t j = 0; j < nCount; j++)

        {

            arr[i][j] = 0; 初始化二维数组

        }

    }

    for(size_t i = 0; i < edge; i++)

    {

        std::cin >> nStart >> nEnd;

        arr[nStart][nEnd] = arr[nEnd][nStart] = 1;  有向图此处修改即可

    }

}

void print()

{

    for(size_t i = 0; i< nCount; i++)

    {

        for(size_t j = 0; j < nCount; j++)

        {

            std::cout << arr[i][[j] << "\t"; \t打印四个空格

        }

        std::coout << std::endl;;

}

边集数组

每个节点内都有三个成员,分别是边的起点,边的终点和权限

数据结构与算法(八)图的基本概念和顺序存储_第2张图片

struct Node

{

    int nStart;

    int nEnd;

    int nWeight;

}e[100];设置可以构造一百个结构体,即一百个边

三个成员,八条边,组成一个八行三列数组

三列依次是起点,终点,权限

如第一行即第一条边:AB,起始0,终点1,权限5

如上同理,得出其他边在该多维数组的位置及数值

std::cin >> nCount >> edge;

for(size_t i = 1; i <= edge; i++) 存储图

{

    std::cin  >> e[i].nStart >> e[i].nEnd >> e[i].nWeight;

}

你可能感兴趣的:(算法,数据结构)