数据结构——图
来源:互联网 发布:微信淘宝客怎么拉人 编辑:程序博客网 时间:2024/06/17 01:47
临接矩阵
#pragma once#include<iostream>#include<assert.h>using namespace std;// 临接矩阵template<class V,class W,size_t N,bool IsDirector=false>//IsDirector标记是无向图还是有向图,默认无向图class GraphMartix{public: GraphMartix() {} GraphMartix(V* vertix) { //此处不要用 memset进行初始化,它适合于内置类型 for (size_t i = 0; i < N; ++i) { _vertix[i] = vertix[i]; } for (size_t i = 0; i < N; ++i) { for (size_t j = 0; j < N; ++j) { _martix[i][j] = W(); } } } //添加边,已知两个顶点,以及权值 void AddEdge(const V& src,const V& dst,const W& w) { //先获取这两个点的位置 int srcIndex=_GetVertexIndex(src); int desInndex=_GetVertexIndex(dst); _martix[srcIndex][desInndex] = w; //如果为无向图,则需要两个点互相都联通 if (IsDirector==false) { _martix[desInndex][srcIndex] = w; } } int _GetVertexIndex(const V& tervex) { for (size_t i = 0; i < N; ++i) { if (_vertix[i] == tervex) return i; } //按照设想,程序不应该走到这一步;如果到这里,说明该点没有被找到 //所以在此处我们采用防御式编程 assert(false); return -1; }protected: V _vertix[N];//顶点集 W _martix[N][N];//边集};void testMartix(){ string add[] = {"school","house","park","market","hospital"}; GraphMartix<string,int, sizeof(add)/sizeof(add[0])> ghm(add); ghm.AddEdge("school", "house",1000); ghm.AddEdge( "house", "park",200); ghm.AddEdge("market", "hospital",100); ghm.AddEdge("park","hospital",700); ghm.AddEdge("park", "market", 600);}
临接矩阵
template<class W>struct LinkEdge{ W _w;//权重 int _src;//边上起始节点 int _dst;//边上目标节点 LinkEdge<W>* _next; //在这里如果单纯实现临接表的话其实没有必要存目标节点 //是最小生成树的算法要用到dst节点 LinkEdge(int src,int dst,const W& w) :_w(w) ,_src(src) ,_dst(dst) , _next(NULL) {}};template<class V, class W, size_t N, bool IsDirector = false>class GraphLink{ typedef LinkEdge<W> Edge;public: GraphLink() {} GraphLink(V* vertexs) { _vertexs.reserve(N); for (size_t i = 0; i < N; ++i) { _vertexs.push_back(vertexs[i]); } _LinkTable.resize(N, NULL); } void AddEdge(const V& src,const V& dst,const W& w) { int srcIndex = _GetVertexIndex(src); int dstIndex = _GetVertexIndex(dst); //头插法向数组中插入节点 _AddEdge(srcIndex,dstIndex,w); if (IsDirector == false) { _AddEdge(dstIndex,srcIndex,w); } } int _GetVertexIndex(const V& vertex) { for (size_t i = 0; i < N; ++i) { if (_vertexs[i] ==vertex) return i; } assert(false); return -1; } void _AddEdge(int srcIndex,int dstIndex,const W& w) { Edge* edge = new Edge(srcIndex,dstIndex,w); //头插 edge->_next = _LinkTable[srcIndex]; _LinkTable[srcIndex] = edge; }protected: vector<V> _vertexs;//顶点集合 //边集的数组是指针数组 vector<Edge*> _LinkTable;//边集};
阅读全文
0 0
- 数据结构——图
- 数据结构——图
- 数据结构——图
- 数据结构——图
- 数据结构——图
- 数据结构——图
- 数据结构——图
- 数据结构——图
- 数据结构——图
- 数据结构——图
- 数据结构——图
- 数据结构—图
- 数据结构随笔—图
- 数据结构—图
- 数据结构之—图
- 数据结构—图I
- 数据结构—图II
- 数据结构—图II
- 点击不同按钮换不同标题栏图标
- Android之模拟网易新闻客户端
- Spring 设计模式——观察者|事件驱动模型
- 如何处理fast_recovery_area无剩余空间
- stringr数据处理
- 数据结构——图
- poj3984 迷宫问题(简单搜索+记录路径)
- Vue.js学习之路—模板语法(使用JavaScript表达式)
- 没有上司的舞会
- LeetCode 167. Two Sum II
- 网络编程小案例之简易新闻客户端
- 时间序列分析之ARIMA上手-Python
- eclipse插件全集
- Java的API调用优化——容器