数据结构学习(C++)之图
true; } name& getV(int n) { return vertices[n].v; } //没有越界检查 int nextV(int m, int n)//返回m号顶点的第n号顶点后第一个邻接顶点号,无返回-1 { for (list<edge>::iterator iter = vertices[m].e->begin(); iter != vertices[m].e->end(); iter++) if (iter->vID > n) return iter->vID; return -1; } private: bool find(const name& v) { for (int i = 0; i < vNum; i++) if (v == vertices[i].v) return true; return false; } bool find(const name& v, int& i) { for (i = 0; i < vNum; i++) if (v == vertices[i].v) return true; return false; } struct edge { edge() {} edge(int vID, dist cost) : vID(vID), cost(cost) {} int vID; dist cost; }; struct vertex { vertex() {} vertex(name v, list<edge>* e) : v(v), e(e) {} name v; list<edge>* e; }; int vNum, eNum; vector<vertex> vertices; }; #endif 这个实现是很简陋的,但应该能满足后面的讲解了。现在这个还什么都不能做,不要急,在下篇将讲述图的DFS和BFS。 DFS和BFS 对于非线性的结构,遍历都会首先成为一个问题。和二叉树的遍历一样,图也有深度优先搜索(DFS)和广度优先搜索(BFS)两种。不同的是,图中每个顶点没有了祖先和子孙的关系,因此,前序、中序、后序不再有意义了。仿照二叉树的遍历,很容易就能完成DFS和BFS,只是要注意图中可能有回路,因此,必须对访问过的顶点做标记。 最基本的有向带权网
你可以看到,这是在以mem方式储存的data上面加了一层外壳。在图这里,逻辑上分有向、无向,带权、不带权;储存结构上有邻接矩阵和邻接表。也就是说分开来有8个类。为了最大限度的复用代码,继承关系就非常复杂了。但是,多重继承是件很讨厌的事,什么覆盖啊,还有什么虚拟继承,我可不想花大量篇幅讲语言特性。于是,我将储存方式作为第三个模板参数,这样一来就省得涉及虚拟继承了,只是这样一来这个Network的实例化就很麻烦了,不过这可以通过typedef或者外壳类来解决,我就不写了。反正只是为了让大家明白,真正要用的时候,最好是写专门的类,比如无向无权邻接矩阵图,不要搞的继承关系乱七八糟。 DFS和BFS的实现
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |