当前位置:   article > 正文

加权无向图_加权无向图数据集

加权无向图数据集

        用数学语言讲,设G为图,对图的每一条边e来说,都对应于一个实数W(e)(可以通俗的理解为边的“长度”,只是在数学定义中图的权可以为负数),我们把W(e)称为e的“权”。把这样的图G称为“加权图”。

加权无向图数据结构使用邻接表来存储



源代码示例:

  1. #include <iostream>
  2. #include <vector>
  3. #include <set>
  4. #include <algorithm>
  5. #include <functional>
  6. using namespace std;
  7. class Edge
  8. {
  9. public:
  10. Edge(size_t _v, size_t _w, double _weight) : v(_v), w(_w), weight(_weight) {}
  11. double getWeight() const { return weight; }
  12. size_t either() const { return v; }
  13. size_t other(size_t v) const
  14. {
  15. if (v == this->v)
  16. return this->w;
  17. else if (v == this->w)
  18. return this->v;
  19. else
  20. {
  21. cout << "error in Edge::other()" << endl;
  22. exit(1);
  23. }
  24. }
  25. void print() const{ cout << "(" << v << ", " << w << ", " << weight << ") "; }
  26. private:
  27. size_t v, w; // 两个顶点
  28. double weight; // 权重
  29. };
  30. class EdgeWeithtedGraph
  31. {
  32. public:
  33. EdgeWeithtedGraph(size_t vertax_nums) : vertaxs(vertax_nums), edges(0), arr(vertax_nums) {}
  34. void addEdge(const Edge e);
  35. vector<Edge> adj(size_t v) const { return v < arrSize() ? arr[v] : vector<Edge>(); }
  36. vector<Edge> allEdges() const; // 返回加权无向图的所有边
  37. size_t arrSize() const { return arr.size(); }
  38. size_t vertax() const { return vertaxs; }
  39. size_t edge() const { return edges; }
  40. void printVertax(size_t v) const;
  41. void printGraph() const;
  42. private:
  43. size_t vertaxs; // 顶点个数
  44. size_t edges; // 边的个数
  45. vector<vector<Edge>> arr; // 邻接表
  46. };
  47. int main(void)
  48. {
  49. EdgeWeithtedGraph graph(8);
  50. graph.addEdge(Edge(0, 7, 0.16));
  51. graph.addEdge(Edge(0, 2, 0.26));
  52. graph.addEdge(Edge(0, 4, 0.38));
  53. graph.addEdge(Edge(0, 6, 0.58));
  54. graph.addEdge(Edge(1, 7, 0.19));
  55. graph.addEdge(Edge(5, 7, 0.28));
  56. graph.addEdge(Edge(2, 7, 0.34));
  57. graph.addEdge(Edge(4, 7, 0.37));
  58. graph.addEdge(Edge(1, 3, 0.29));
  59. graph.addEdge(Edge(1, 5, 0.32));
  60. graph.addEdge(Edge(1, 2, 0.36));
  61. graph.addEdge(Edge(2, 3, 0.17));
  62. graph.addEdge(Edge(6, 2, 0.40));
  63. graph.addEdge(Edge(3, 6, 0.52));
  64. graph.addEdge(Edge(4, 5, 0.35));
  65. graph.addEdge(Edge(6, 4, 0.93));
  66. cout << "arrSize: " << graph.arrSize() << endl;
  67. cout << "vertax: " << graph.vertax() << endl;
  68. cout << "edge: " << graph.edge() << endl;
  69. cout << "----------------" << endl;
  70. graph.printGraph();
  71. cout << endl;
  72. system("pause");
  73. return 0;
  74. }
  75. void EdgeWeithtedGraph::addEdge(const Edge e)
  76. {
  77. size_t v = e.either();
  78. size_t w = e.other(v);
  79. if (!(v < arrSize() && w < arrSize()))
  80. return;
  81. arr[v].push_back(e);
  82. arr[w].push_back(e);
  83. this->edges++;
  84. }
  85. vector<Edge> EdgeWeithtedGraph::allEdges() const
  86. {
  87. vector<Edge> vec;
  88. for (size_t i = 0; i < arrSize(); i++)
  89. {
  90. for (size_t j = 0; j < arr[i].size(); j++)
  91. {
  92. if (arr[i][j].other(i) > i) // 所有边的权重各不不同,可以这样判断,每个边只保留一个
  93. vec.push_back(arr[i][j]);
  94. }
  95. }
  96. return vec;
  97. }
  98. void EdgeWeithtedGraph::printVertax(size_t v) const
  99. {
  100. if (v >= arrSize())
  101. return;
  102. for (size_t i = 0; i < arr[v].size(); i++)
  103. arr[v][i].print();
  104. cout << endl;
  105. }
  106. void EdgeWeithtedGraph::printGraph() const
  107. {
  108. for (size_t i = 0; i < arrSize(); i++)
  109. {
  110. cout << i << ": ";
  111. printVertax(i);
  112. }
  113. }

参考资料

        1、https://github.com/luoxn28/algorithm_data_structure (里面有常用的数据结构源代码,图相关算法在graph文件夹中)

        2、《算法 第4版》 图有关章节


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/152060
推荐阅读
相关标签
  

闽ICP备14008679号