天天看點

算法導論 22.3-6

22.3-6重寫DBS,用一個棧來實作遞歸

隻需要将調用過程參數用棧儲存即可,分析發現需要儲存的資料隻有目前的通路節點。

資料仍然使用做22.2-6的圖

#include<stack>

#include<iostream>

#include<fstream>

#define V 10

#define MAX (~(1<<(8*sizeof(int)-1)))

using namespace std;

enum Color{WHITE,GRAY,BLACK};

int m[V][V];

Color color[V];

int d[V];

int p[V];

int f[V];

int num;

stack<int> st;

int tim;

//從u開始dfs

void DFS(){

    for(int i=0;i<num;i++){

       color[i]=WHITE;

       p[i]=-1;        

    }   

    tim=0;

    for(int u=0;u<num;u++){

    if(color[u]!=WHITE)continue;

    color[u]=GRAY;

    tim=tim+1;

    d[u]=tim;

    st.push(u);

    printf("%d-->",u);

    while(!st.empty()){

       int v=st.top();

       bool flag=true;

       for(int i=0;i<num;i++){

           if(m[v][i]!=0&&color[i]==WHITE){

              p[i]=v;

              tim++;

              color[i]=GRAY;

              d[i]=tim;

              printf("%d-->",i);

              st.push(i);  flag=false; break;                         

           }        

       }

       if(flag){      

          st.pop();

          color[v]=BLACK;

          tim++;

          f[v]=tim;

       }                     

    }    

    }

}

int main()

{

   fstream f;

   f.open("input22.2-6.txt");

   int u,v;

   f>>num;

   while(f>>u>>v){m[u][v]=m[v][u]=1;}

   DFS();

   f.close();

   system("pause");

   return 0;    

}

繼續閱讀