图——图的遍历

图的两种表示方法:

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值