算法导论 第22章 深度优先遍历

         深度优先遍历的作用主要是对边,点的分类,如拓扑排序,找强连通分量等应用。

         深度优先搜索的策略是只要有可能就尽量深入。也就是说每发现一个新的点就立马对其搜索,直到与该点所连接的所有点都被搜索完全,则返回了,返回该点的前驱。

         由于深度优先搜索一般都是被其他算法所用,所以它要提供有效的信息,每个点保存一个d值和f值,d值是刚发现的时间,f值为结束对该点邻接点扫描的时间。 比如一个孤立点,发现时间为 p,则结束时间为p+1, 另外还保存一种颜色,白色为还未被发现,灰色为还未对该点搜索完,黑色该点已经被搜索完了。

    

#include
#include
#include

 using namespace std;


 class node
 {
  public:
      node():adjvex(0),nextvex(NULL){}
     int  adjvex;
     node *nextvex;

 };

class vex
{
public:

  char color;
  int predecessor;

  int d; //发现时间
  int f; //完成时间
};

typedef node *  adjnode;


 class Graph
{
 public:
    int n;//顶点个数
    adjnode *Adj;
    vex * vexs;
 };



void CreateGraph(Graph &g)
{
    ifstream  infile("graph22-6.txt");

    cin.rdbuf(infile.rdbuf());
 if(g.Adj==NULL)cout<<1<>n;

 g.Adj=new adjnode[n+1];// 0号不用
 g.vexs=new vex[n+1];
 g.n=n;

cout<<"依次输入与每个顶点相邻的顶点号,以0为结束"<>x;
    if(x==0)
        break;
  else
   if(ex!=0){
    ne->nextvex=new node;
    ne=ne->nextvex;
   }
   ++ex;
    ne->adjvex=x;
  }//while
}
}



void printGraph(Graph g)
{
   for(int i=1;i!=g.n+1;++i){
      adjnode p=g.Adj[i];
      while(p!=NULL){
        cout<adjvex<<"  ";
        p=p->nextvex;
      }
      cout<nextvex)  //对u点连接的点进行单个深度搜索
    {
        int tem=p->adjvex;
            if(g.vexs[tem].color=='W'){  //发现还未被发现的点
                g.vexs[tem].predecessor=u;
                Dfs_visit(g,tem);   //递归调用
            }
}

g.vexs[u].color='B';  //完成对u点的搜索    用黑色表示
++time; //时间加1  从搜索点返回到u
g.vexs[u].f=time; //完成时间赋值
}




void DepthFisrtSreach(Graph g)  //深度优先搜索, O(V+E )   。 尽可能的深入
{

 for(int i=1;i!=g.n+1;++i){   //初始化 所以点都白色,,还未被发现
    g.vexs[i].color='W';
    g.vexs[i].predecessor=i;
   }

 for(int i=1;i!=g.n+1;++i){   //对每个还未发现的点调用Dfs_visit
      if(g.vexs[i].color=='W'){
             Dfs_visit(g,i);
      }
 }


cout<<"         前驱       "<<"d值"<<"       f值"<

你可能感兴趣的:(算法导论)