——本节内容为Bilibili王道考研《数据结构》P58视频内容笔记。
目录
8.Get_edge_value(G,x,y)和Set_edge_value(G,x,y,v)
一、总览
1.
2.本节只讨论邻接矩阵和邻接表的存储方式;
二、基本操作
1.Adjacent(G,x,y)
(1)功能:判断图G是否存在边<x,y> 或(x,y)。
(2)无向图:
①邻接矩阵:找到x行y列对应元素并判断是否为1;时间复杂度O(1)。
②邻接表:查找x的边结点有没有y;最好情况:第一个就是;最坏情况:最后一个也不是;时间复杂度O(1)~O(|V|)。
(3)有向图:
①邻接矩阵:方法同无向图;时间复杂度O(1)。
②邻接表:方法同无向图;时间复杂度O(1)~O(|V|)。
(4)无向有向图都采用邻接矩阵更好。
2.Neighbors(G,x)
(1)功能:列出图G中与结点x邻接的边。
(2)无向图:
①邻接矩阵:找到x行中所有为1的元素对应的边列举出来;时间复杂度O(|V|)。
②邻接表:遍历边结点链表;最好情况:一条边;最坏情况:|V-1|条边;时间复杂度O(1)~O(|V|)。
(3)有向图:
①邻接矩阵:方法同无向图(出度找行,入度找列);时间复杂度O(|V|)。
②邻接表:出度遍历链表(同无向图),入度遍历所有边结点;时间复杂度:出度O(1)~O(|V|);入度O(|E|)。
(4)无向图采用邻接表;有向图如果是稀疏图则采用邻接表,稠密图采用邻接矩阵。
3.InsertVertex(G,x)
(1)功能:在图G中插入顶点x。
(2)无向图:
①邻接矩阵:由于矩阵置零在初始化完成,所以写入新元素信息即可;时间复杂度O(1)。
②邻接表:写入新元素信息,*first置为NULL;时间复杂度O(1)。
(3)有向图同无向图一样。
4.DeleteVertex(G,x)
(1)功能:从图G中删除顶点x。
(2)无向图:
①邻接矩阵:将x对应的行列元素全部置零,用bool标记x所在的顶点结构体;时间复杂度O(|V|)。
②邻接表:将x对应的边结点删除,*first置空;时间复杂度O(1)~O(|E|)。
(3)有向图:
①邻接矩阵:同无向图。
②邻接表:删除出边:同邻接表;删除入边:遍历所有弧结点;删出边时间复杂度O(1)~O(|V|);删入边时间复杂度O(|E|)。
5.AddEdge(G,x,y)
(1)功能:若无向边(x,y)或有向边<x,y>不存在,则向图G中添加该边。
(2)无向图:
①邻接矩阵:已知坐标直接改值;时间复杂度O(1)。
②邻接表:头插法插入到x和y的*first位置;时间复杂度O(1)~O(|V|)。
(3)有向图同无向图。
6.FirstNeighbor(G,x)
(1)功能:求图G中顶点x的第一个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x则返回-1。
(2)无向图:
①邻接矩阵:遍历x行直到找到第一个1;时间复杂度O(1)~O(|V|)。
②邻接表:找到边结点链表的第一个结点;时间复杂度O(1)。
(3)有向图:
①邻接矩阵:同无向图,出边找行,入边找列;时间复杂度O(1)~O(|V|)。
②邻接表:出边同无向图,入边遍历所有弧结点;出边时间复杂度O(1),入边时间复杂度O(1)~O(|E|)。
7.NextNeighbor(G,x,y)
(1)功能:假设图G中顶点y是顶点x的一个邻接点,返回除y之外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点则返回-1。
(2)无向图:
①邻接矩阵:按行扫描x行y列下一个1;时间复杂度O(1)~O(|V|)。
②邻接表:扫描y结点的下一个边结点;时间复杂度O(1)。
(3)有向图同无向图。
8.Get_edge_value(G,x,y)和Set_edge_value(G,x,y,v)
(1)功能:
①Get_edge_value(G,x,y):获取图G中边(x,y)或<x,y>对应的权值;
②Set_edge_value(G,x,y,v):设置图G中边(x,y)或<x,y>对应的权值为v。
(2)核心在于找边或弧,即Adjacent(G,x,y);
(3)时间复杂度:
①Get_edge_value(G,x,y):O(1);
②Set_edge_value(G,x,y,v):O(1)~O(|V|)。