• Adjacent(G,x,y):判断图G是否存在边
• Neighbors(G,x):列出图G中与结点x邻接的边。
无向图:
有向图:
• InsertVertex(G,x):在图G中插入顶点x。
• DeleteVertex(G,x):从图G中删除顶点x。
无向图:
有向图:
• AddEdge(G,x,y):若无向边(x, y)或有向边不存在,则向图G中添加该边。
• RemoveEdge(G,x,y):若无向边(x, y)或有向边存在,则从图G中删除该边。
• FirstNeighbor(G,x):求图G中顶点x的第一个邻接点,若有则返回顶点号。若x没有邻接点 或图中不存在x,则返回-1。
无向图:
有向图:
• NextNeighbor(G,x,y):假设图G中顶点y是顶点x的一个邻接点,返回除y之外顶点x的下一 个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1。
无向图:
• Get_edge_value(G,x,y):获取图G中边(x, y)或对应的权值。
• Set_edge_value(G,x,y,v):设置图G中边(x, y)或对应的权值为v。
后两个 与Adjacent(G,x,y) 雷同,核心在于找到边:
①确定一个起始顶点v,将节点入队
②将对头元素v出队,依此访问v的各个未被访问的邻接节点,并将这些节点依此入队
③依此以各个邻接节点为起始节点重复步骤①②,直到整个图都遍历(队空+利用辅助数组标记各节点访问情况,防止出现非连通图未遍历的情况)
bool visited[Max_Vertex_Num];
void BFSTraverse(Graph G)
{
for(int i=0; i=0; w=NextNeighbor(G, v, w))
{
if(!visited[w])
{
visit(w);
visited[w] = true;
EnQueue(Q, w);
}
}
}
}
(1)空间复杂度: 最坏情况,辅助队列大小为 。
(2)对于邻接矩阵存储的图,访问个顶点需要的时间,查找每个顶点的邻接点都需要 的时间,而总共有个顶点,时间复杂度为。
(3)对于邻接表存储的图,访问个顶点需要的时间,查找各个顶点的邻接点共需要的时间,时间复杂度为。
深度优先遍历(Depth First Search),也有称为深度优先搜索,简称为DFS。
bool visited[MAX_VERTEX_NUM]; //访问标记数组
/*从顶点出发,深度优先遍历图G*/
void DFS(Graph G, int v){
int w;
visit(v); //访问顶点
visited[v] = TRUE; //设已访问标记
//FirstNeighbor(G,v):求图G中顶点v的第一个邻接点,若有则返回顶点号,否则返回-1。
//NextNeighbor(G,v,w):假设图G中顶点w是顶点v的一个邻接点,返回除w外顶点v
for(w = FirstNeighbor(G, v); w>=0; w=NextNeighor(G, v, w)){
if(!visited[w]){ //w为u的尚未访问的邻接顶点
DFS(G, w);
}
}
}
/*对图进行深度优先遍历*/
void DFSTraverse(MGraph G){
int v;
for(v=0; v
空间复杂度:来⾃函数调⽤栈,时间复杂度=访问各结点所需时间+探索各条边所需时间
(1)空间复杂度主要来自来⾃函数调⽤栈,最坏情况下递归深度为 ;最好情况为
(2)对于邻接矩阵存储的图,访问个顶点需要的时间,查找每个顶点的邻接点都需要 的时间,而总共有个顶点,时间复杂度为。
(3)对于邻接表存储的图,访问个顶点需要的时间,查找各个顶点的邻接点共需要的时间,时间复杂度为。