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

来源:互联网 发布:百度彩票数据接口 编辑:程序博客网 时间:2024/04/30 07:40

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

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

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

    

#include<iostream>#include<fstream>#include<queue> 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<<endl; cout<<"请输入顶点数"<<endl; int n,x; cin>>n; g.Adj=new adjnode[n+1];// 0号不用 g.vexs=new vex[n+1]; g.n=n;cout<<"依次输入与每个顶点相邻的顶点号,以0为结束"<<endl;for(int i=1;i!=n+1;++i){ g.Adj[i]=new node;  adjnode ne=g.Adj[i];  int ex=0;  while(true){    cin>>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<<p->adjvex<<"  ";        p=p->nextvex;      }      cout<<endl;   }}int time=0;  //全局变量 初始化为0void Dfs_visit(Graph &g,int u)    //对某个白色的点进行深度搜索{   time++; //从上个点到这个点 时间+1   g.vexs[u].d=time;      //发现时间   g.vexs[u].color='G';          //变为灰色,表示还未完成对点u的深度搜索 for(adjnode p=g.Adj[u];p!=NULL;p = p->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  从搜索点返回到ug.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值"<<endl;for(int i=1;i!=g.n+1;++i){      cout<<"结点"<<i<<":     "<<g.vexs[i].predecessor <<"       "<<g.vexs[i].d<<"           "<<g.vexs[i].f <<endl;   }} int main() { Graph G; CreateGraph( G); printGraph(G);DepthFisrtSreach(G); return 0;}

0 0
原创粉丝点击