图的基本操作

1.判断图是否存在边

Adjacent(G,x,y):判断图G是否存在边或弧(x, y)

1.在无向图中

  • 使用邻接矩阵时,只需要判断相关的两个元素所对应的矩阵元素是否为零即可。
    时间复杂度为O(1)。
  • 使用邻接表时,遍历其中一个元素的边结点,是够能够找到另外一个元素。
    时间复杂度为O(1)~O(|V|)。

2.在有向图中

与无向图中的分析类似,邻接矩阵判断存在边还是会更优秀一些。

2.列出结点相邻的边

Neighbors(G,x):列出图G中与结点x邻接的边。

1.在无向图中

  • 使用邻接矩阵实现时,只需要遍历当前元素所在的某一行或者某一列,其中不为0的元素就是所有的相邻元素。时间复杂度为O(|V|)。
  • 使用邻接表实现时,只需要遍历和当前结点相连的链表即可。时间复杂度为O(1)~O(|V|)。

2.在有向图中

  • 使用邻接矩阵实现时,找出边只需要遍历当前元素的所在行中不为零的元素;要找入边只需要遍历当前元素所对应的所在列中不为零的元素。时间复杂度都为O(|V|)。
  • 使用邻接表实现时,要找出边只需要遍历当前结点相连的链表,时间复杂度为O(1)~O(|V|);要找入边就只有遍历完邻接表所有的边结点,时间复杂度为O(|E|)。

3.插入顶点

lnsertVertex(G,x):在图G中插入顶点x。

1.在无向图中

  • 使用邻接矩阵实现时,矩阵边界增加一行一列,将顶点信息写入数组即可。时间复杂度为O(1)。
  • 使用邻接表实现时,在数组末尾增加一个结点,将指针设为NULL。时间复杂度为O(1)。

有向图与上述类似。

4.删除顶点

DeleteVertex(G,x):从图G中删除顶点x。

1.在无向图中

  • 使用邻接矩阵实现时,将顶点所在的行和列的所有元素置零。时间复杂度都为O(|V|)。
  • 使用邻接表实现时,将顶点和相连的链表清空,并遍历整个邻接表,删除与当前顶点相关的所有边。时间复杂度为O(1)~O(|E|)。

2.在有向图中

  • 使用邻接矩阵实现时,与无向图是一致的。
  • 使用邻接表实现时,删除出边时,删除顶点和相连链表即可,时间复杂度为O(1)~O(|V|)。删除入边时,需要遍历所有边,删除与当前顶点相关的所有边,时间复杂度为O(|E|)。

5.增加一条边

AddEdge(G,x,y):若无向边(x,y)或有向边不存在,则向图G中添加该边。

1.在无向图中

  • 使用邻接矩阵实现时,修改相关元素对应的值为1即可。时间复杂度为O(1)。
  • 使用邻接表实现时,分别在两个元素的相连链表使用头插法插入彼此的数组下标。时间复杂度为O(1)~O(|V|)。

有向图与无向图类似。

6.查找顶点的第一个邻接点

FirstNeighbor(G,x):求图G中顶点x的第一个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x,则返回-1。

1.在无向图中

  • 使用邻接矩阵实现时,扫描当前顶点所在的行或者列,直到找到一个非零元素即可。时间复杂度为O(1)~O(|V|)。
  • 使用邻接表实现时,只需要找边结点所对应链表的第一个结点。时间复杂度为O(1)。

2.在有向图中

  • 使用邻接矩阵实现时,找出边扫描行;找入边扫描列。时间复杂度为O(1)~O(|V|)。
  • 使用邻接表实现时,找出边,只需要找边结点所对应链表的第一个结点,时间复杂度为O(1);找出边临界点,遍历所有边找到指向当前结点的边,时间复杂度为O(1)~O(|E|)。

7.查找下一个结点

NextNeighbor(G,x,y):假设图G中顶点y是顶点x的一个邻接点,返回除y之外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1。

1.在无向图中

  • 使用邻接矩阵实现时,查找所在行或列,时间复杂度为O(1)~O(|V|)。
    • 使用邻接表实现时,当前结点所在链表的顺序两个结点。

8.获取权值,设置权值

Get_edge_value(G,x,y):获取图G中边(x, y)或对应的权值。
Set_edge_value(G,x,y,v):设置图G中边(x, y)或对应的权值为v。

与操作1中的查找边雷同,核心在于找到边。

此外,还有图的遍历算法,包括深度优先遍历和广度优先遍历。

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