C ++我的DFS代码出了什么问题?

时间:2014-09-04 14:54:19

标签: c++ codeblocks depth-first-search

我尝试编写CLRS中给出的DFS算法。这是下面的代码。当我运行它时,我得到一个错误,因为“你的程序意外停止了。”当我调试代码时,我在调用堆栈“msvcrt!malloc()”和“operator new(unsigned int)”中得到了这一行。我正在使用CodeBlocks。我哪里错了?

#include<iostream>
#include<cstdlib>
#include<vector>
#include<list>
#include<utility>
#include<algorithm>
#include<string>
using namespace std;

struct prop
{
    int p;
    int value;
    int d;
    int f;
    string color;
};

vector<prop>v;

prop make_prop(int a,int b,int c,int d,string e)
{
    prop p = {a,b,c,d,e};
    return p;
}

class Dfs
{
public:
    int time;
    vector<list<int> >adj;
    Dfs(int nv)
    {
        v.resize(nv);
        adj.resize(nv);
        for(int i=0;i<nv;i++)
        {
            v[i].value = i;
            v[i].p = -1;
            v[i].color = "WHITE";
        }
    }
    void addinput()
    {
        adj[0].push_back(1);
        adj[0].push_back(2);
        adj[0].push_back(3);
        adj[1].push_back(0);
        adj[1].push_back(3);
        adj[2].push_back(0);
        adj[2].push_back(3);
        adj[3].push_back(0);
        adj[3].push_back(1);
        adj[3].push_back(2);
    }
    void dfs();
    void dfsvisit(prop);
};

void Dfs::dfs()
{
    time = 0;
    for(int i=0;i<v.size();i++)
    {
        if(v[i].color == "WHITE")
        {
            dfsvisit(v[i]);
        }
    }
}

void Dfs::dfsvisit(prop m)
{
    time++;
    m.d = time;
    m.color = "GRAY";
    int val = m.value;
    for(auto it = adj[val].begin();it != adj[val].end();it++)
    {
        if(v[*it].color == "WHITE")
        {
            v[*it].p = val;
            dfsvisit(v[*it]);
        }
    }
    m.color = "BLACK";
    cout<<m.value;
    time++;
    m.f = time;
}

int main()
{
    Dfs d(4);
    d.addinput();
    d.dfs();
    return 0;
}

2 个答案:

答案 0 :(得分:1)

void Dfs::dfsvisit(prop m) // should be prop&

dfsvisit(prop m)会在dfsvisit(prop& m)收到引用时制作该属性的副本,直接处理您传递给该函数的属性

答案 1 :(得分:1)

堆栈会溢出! 在函数dfsvisit中,您将按值传递参数,这将永远不会更改实际参数。您应该通过引用传递参数。

void dfsvisit(prop& m);