图的两种表示方法:
1、图的邻接矩阵
2、图的邻接表
图的两种遍历方法:
1、深度优先搜索:
访问顶点v,并对v做已访问标记;依次从v的未访问的邻接点出发,对图进行深度优先搜索
(图中所有顶点,以及在遍历时经过的边(即从已访问的顶点到达未访问的顶点的边)构成的子图,称为图的深度优先搜索生成树)(或生成森林)
代码:
template<class T>
void ExtLGraph<T>::DFS(int v,bool* visited)
{
cout<<" "<<v;
visited[v]=true;
for(ENode<T> *p=a[v];p;p=p->nextArc)
if(!visited[p->adjVex])
DFS(p->adjVex,visited);
}
template<class T>
void ExtLGraph<T >::DFS()
{
bool* visited=new bool [n];
for(int i=0;i<n;i++) visited[i]=false;
for (i=0;i<n;i++)
if (!visited[i]) DFS(i,visited);
delete[]visited;
}
2、宽度优先遍历
从图中某个顶点v出发的宽度优先搜索过程BFS可以描述为:访问顶点v,并对v做已访问标记,然后依次访问v的各个未访问过的邻接点,接着再依次访问分别与这些邻接点相邻接且未访问过的顶点
(图中所有顶点以及在遍历时经过的边(即从已访问的顶点到达未访问的顶点的边)构成的子图称为图的宽度优先搜索生成森林(每棵树称为生成树))
代码:
template<class T>
void ExtLGraph<T>::BFS(int v, bool* visited)
{
SeqQueue<int> q(QSize);
cout<<" "<<v;
visited[v]=true;
q.EnQueue(v);
while (! q.IsEmpty()){
q.Front(v); q. DeQueue();
for (ENode<T> *p=a[v]; p; p=p->nextArc)
if (!visited[p->adjVex]){
cout<<" "<< p->adjVex;
visited[p->adjVex]=true;
q.EnQueue(p->adjVex);
}
}
}
template<class T>
void ExtLGraph<T >::BFS()
{
bool* visited=new bool [n];
for(int i=0;i<n;i++) visited[i]=false;
for (i=0;i<n;i++)
if (!visited[i]) BFS(i,visited);
delete[]visited;
}