一、概念
1、图的遍历
从图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次。
二、深度优先遍历
- 从图中某个初始顶点v出发,首先访问初始顶点v。
- 选择一个与顶点v相邻且没被访问过的顶点w,再从w出发进行深度优先搜索,直到图中与当前顶点v邻接的所有顶点都被访问过为止。
QMap<elementType,int> map;
void DFS(AdjGraph *G,elementType v)
{
map[v] = 1; //置已访问标记
qDebug()<<v;
ArcNode *p{nullptr};
for(int i = 0;i < MAXV;++i)
{
if(G->adjlist[i].data == v)
{
p = G->adjlist[i].firstarc;
break;
}
}
while (p)
{
elementType w = p->advex;
if (!map.contains(w))
DFS(G,w); //若w顶点未访问,递归访问它
p = p->nextarc; //p指向顶点v的下一条边的边头结点
}
}
int arr[MAXV][MAXV] = {{0,1,0,1,1},
{1,0,1,1,0},
{0,1,0,1,1},
{1,1,1,0,1},
{1,0,1,1,0}};
AdjGraph * G{nullptr};
elementType nodeName[MAXV] = {'A','B','C','D','E'};
CreateAdj(G,arr,nodeName,8);
DispAdj(G);
qDebug()<<"----------";
DFS(G,'C');
DestroyAdj(G);
三、广度优先遍历
- 访问初始点v,接着访问v的所有未被访问过的邻接点v1,v2,…,vt。
- 按照v1,v2,…,vt的次序,访问每一个顶点的所有未被访问过的邻接点。
- 依次类推,直到图中所有和初始点v有路径相通的顶点都被访问过为止。
void BFS(AdjGraph *G,elementType v)
{
QQueue<elementType> qu;
QMap<elementType,int> map;
qDebug()<<v;
map[v] = 1;
qu.enqueue(v);
while (!qu.isEmpty())
{
elementType w = qu.dequeue();
ArcNode *p{nullptr};
for(int i = 0;i < MAXV;++i)
{
if(G->adjlist[i].data == w)
{
p = G->adjlist[i].firstarc;
break;
}
}
while (p) //查找w的所有邻接点
{
if(!map.contains(p->advex)) //若当前邻接点未被访问
{
qDebug()<<p->advex;
map[p->advex] = 1; //置已访问标记
qu.enqueue(p->advex);//该顶点进队
}
p = p->nextarc; //找下一个邻接点
}
}
}
int arr[MAXV][MAXV] = {{0,1,0,1,1},
{1,0,1,1,0},
{0,1,0,1,1},
{1,1,1,0,1},
{1,0,1,1,0}};
AdjGraph * G{nullptr};
elementType nodeName[MAXV] = {'A','B','C','D','E'};
CreateAdj(G,arr,nodeName,8);
DispAdj(G);
qDebug()<<"----------";
BFS(G,'C');
DestroyAdj(G);