DFS中程序递归调用的问题

昨天晚上在做课程设计的时候,我写的这个dfs一直显示递归调用错误,一开始百思不得其解,在多次观察程序运行后发现,这是因为vector的迭代器越界所导致的,而迭代器为什么会越界呢,这里就和我之前写的代码有关了。

原dfs程序:

typedef char vertextype;    //定义顶点的存储类型
typedef int arctype;    //定义边的权值类型

struct ANode  //边表节点
{
    int id; //邻接点域,存储该顶点对应的下标
    arctype wigth;  //用于存储权值
};

struct VNode   //顶点表节点
{
    string data;    //存储顶点数据的信息
    vector<ANode> q;    //每个点与之相邻接的点与权值
};

vector<ANode>::iterator it;
class Graph
{
private:
    int sum=0;//统计点访问次数
    VNode VNodeList[maxn];//顶点表节点,存放每个点信息
    bool vis[maxn];
public:
    int pointnum,eagenum;//点数,边数
    Graph(int n,int m);
    void initdfs(int n);
    void dfs(int begin);
    void bfs(int begin);
    int is_connected();
    int get_degree(int a[]);
    void print();
};
void Graph::dfs(int n)
{
    cout<<VNodeList[n].data<<endl;
    sum++;
    vis[n]=1;
    if(sum>=this->pointnum)
        return;
    for(it=VNodeList[n].q.begin();it<VNodeList[n].q.end();it++)
    {
        if(!vis[it->id])
        {
            dfs(it->id);
        }
    }
}

可以发现,原来的这个dfs程序中,it这个迭代器是全局的(当时为了方便。。。。),然而在后边程序运行过程中不断对这个全局变量进行修改,因而导致了这些问题,所以把迭代器申明放在for循环里就解决了这个问题。
/*
    stl版
    利用现有stack和queue实现的
    图采取的数据结构:邻接表
    邻接表用vector来实现
    有向图
    最大点数为107
    点下标输入默认从0开始,处理数据按从0开始
*/

#include <iostream>
#include <sstream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
const int maxn = 1e2+7;
using namespace std;

typedef char vertextype;    //定义顶点的存储类型
typedef int arctype;    //定义边的权值类型

struct ANode  //边表节点
{
    int id; //邻接点域,存储该顶点对应的下标
    arctype wigth;  //用于存储权值
};

struct VNode   //顶点表节点
{
    string data;    //存储顶点数据的信息
    vector<ANode> q;    //每个点与之相邻接的点与权值
};

vector<ANode>::iterator it;

class Graph
{
private:
    int sum=0;//统计点访问次数
    VNode VNodeList[maxn];//顶点表节点,存放每个点信息
    bool vis[maxn];
public:
    int pointnum,eagenum;//点数,边数
    Graph(int n,int m);
    void initdfs(int n);
    void dfs(int begin);
    void bfs(int begin);
    int is_connected();
    int get_degree(int a[]);
    void print();
};

Graph::Graph(int n,int m)//构造函数,输入
{
    this->pointnum=n,this->eagenum=m;
    //printf("请输入%d个点的名字:\n",n);
    for(int i=0;i<this->pointnum;i++)
    {
        //printf("第%d个点的名称为:",i);
        cin>>VNodeList[i].data;
    }
    //printf("请输入%d个边的信息,格式:起点编号 终点编号 权值:\n",m);
    int begin,end,wight;
    for(int i=0;i<this->eagenum;i++)
    {
        //printf("第%d条边的信息:",i);
        cin>>begin>>end>>wight;
        VNodeList[begin].q.push_back( {end,wight} );
    }
}

void Graph::initdfs(int n)
{
    sum=0;
    memset(vis, 0, sizeof(vis));
}

void Graph::dfs(int n)
{
    string s = VNodeList[n].data;
    cout<<VNodeList[n].data<<endl;
    sum++;
    vis[n]=1;
    if(sum>=this->pointnum)
        return;
    for(vector<ANode>::iterator i=VNodeList[n].q.begin();i<VNodeList[n].q.end();i++)
    {
        if(!vis[i->id])
        {
            dfs(i->id);
        }
    }
}

void Graph::print()//输出
{
    for(int i=0;i<pointnum;i++)
    {
        cout<<VNodeList[i].q.end()-VNodeList[i].q.begin()<<endl;
        cout<<VNodeList[i].data<<" ";
        for(it=VNodeList[i].q.begin();it<VNodeList[i].q.end();it++)
        {
            cout<<i<<" "<<it->id<<" "<<it->wigth<<"   ";
        }
        cout<<endl;
    }
}

int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        Graph mmp(n,m);
        mmp.print();
        int x;
        cin>>x;
        mmp.initdfs(x);
        mmp.dfs(x);
        cout<<"endl"<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/hrbust_cxl/article/details/88594444
今日推荐