0

隣接リストから作成されたグラフがあります。どうにかして DFS にグラフの postorder も出力させようとしています。DFS機能でこれを行う方法について誰か提案がありますか? どうもありがとうございます

サンプル入力:

create 6  
insert 0 3 0  
insert 0 1 0  
insert 1 3 0  
insert 1 2 0  
insert 2 1 0  
insert 3 5 0  
insert 3 4 0  
insert 3 2 0  
insert 4 2 0  
insert 5 2 0  
DFS 0

コード:

main.cpp

using namespace std;
#include "graph.h"

//Main Function 
int main(){

string command,command1;
int src,dest,wght,start,size;


cout << "graph>";
    cin>>command; 
    if(command=="create")
    cin>>size;
    graph A(size);  //initial class instance


//handles all I/O
  do{           
        cout << "graph>";
        cin >> command;

        //Creates an array of size "size" for nodes to be added too
        //if(command == "create"){

            //cin>>size;
            //resize(size);

        //}
        //Tests for user insertion of node
        if (command == "insert"){

            cin >> src >> dest >> wght;
            if(src <= size && dest <= size){
                A.insert(src, dest, wght);
            }
            else{
                cout<<"Error! Node does not exist!"<<endl;
            }
        }

        //Tests for user removal of node
        else if(command == "remove"){

            cin >> src >> dest;
            if(src <= size && dest <= size){
                A.remove(src, dest);
            }
            else{
                cout<<"Error! Node does not exist!"<<endl;
            }
        }

        //Tests for user printing of graph
        else if(command == "DFS"){
            cin >> start;
            A.DFS(start);     
        }

        //Tests for user printing of graph
        else if(command == "print"){
            A.print();     
        }

        else{
            if(command != "quit")
                cout<<"Error! Command not supported."<<endl;
        }

    }while(command != "quit" );

 return 0;
}

グラフ.h

//graph class file
using namespace std;
#include "node.h"

class graph{
    private:
        int h,f;
        int state[30];
        int counter[30];
        class alist* array;
    public:

        //Initializes the Graph and fills it with NULLs
        graph(int h){
            this->h = h;
            array = new alist [h];
            for (int i = 0; i < h; ++i)
                array[i].head = NULL;
        }

        //Creates a new node by calling instance newlist of listnode
        listnode* newlist(int dest){
            listnode* newnode = new listnode;
                newnode->dest = dest;
                    newnode->next = NULL;
            return newnode;
        }

        //Connects the node of the Graph
        void insert(int src, int dest, int weight){

            listnode* newnode = newlist(dest); 
    newnode->next = array[src].head; 
        newnode->weight = weight; 
            array[src].head = newnode;  
                newnode = newlist(src); 
                    newnode->next = array[dest].head;

        }

        //Removes a node from the graph
        void remove(int srcr, int destr){

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

                listnode* move = array[i].head;
                while (move){
                    if(destr == move->dest){
                        if(srcr==i)
                            array[i].head = NULL;
                    }
                move = move->next;
                }                 
            }
        }

        //Prints the Graph      
        void print(){

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

                listnode* move = array[i].head;
                while (move){
                    cout<<"("<<i <<","<< move->dest<< ","<< move->weight <<")";
                    move = move->next;
                }  
            }
            cout<<endl;
        }

        //Traverses the graph using DFS     
        int DFS(int start){
            state[start]=1; //marks the node as visited
            if(start==(h)){ //exits once all nodes have been visited
                return 0;}

                listnode* move = array[start].head;

                    cout<<"Visited "<<start<<endl;

                    if(state[start]!=1){
                        DFS(start);}

                    start++;
                    DFS(start);

        }
};

list.h

//list class file
using namespace std;
#include <iostream>
#include <cstdlib>

//Adjacency List
class alist
{
    public:
    class listnode *head;
};

node.h

//node class file
using namespace std;
#include "list.h"

//Nodes
class listnode
{
    public:
    int dest;
    int weight;
    class listnode* next;
};
4

1 に答える 1

1

C++ で独自のグラフ クラスを書き直さないでください。boost::graph を使用する方が高速である可能性が高くなります。

DFS の実装が間違っているようです。ノードのすべての兄弟を反復していません。

最初に、すべての状態を WHITE に初期化する必要があります。ノードを最初に発見したときは、灰色であるとマークします。次に、ノードのすべての兄弟に対して DFS を再帰します (ノードが WHITE としてマークされていない場合は何もしません)。すべての兄弟にアクセスしたら、ノードを BLACK としてマークします。この時点で、ノードのインデックスを出力できます。これにより、ポストオーダー トラバーサルが得られます。

于 2014-07-23T09:38:56.403 に答える