昨天晚上在做课程设计的时候,我写的这个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; } }