图的表示最长用的两种方法是:

1)、邻接矩阵表示法

2)、邻接表表示

下面是两种构造图的方法

1)邻接矩阵:

[cpp] view plaincopy
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. //枚举类型,图的种类 DG:有向图;WDG:带权值的有向图;
  5. //UDG: 无向图;WUDG: 带权值的无向图
  6. enum GraphKind {DG, WDG, UDG, WUDG};
  7. //vertexType顶点类型,VRType:顶点之间的关系类型,InfoType:弧的信息类型
  8. template <typename VertexType, typename VRType, typename InfoType>
  9. class MGraph
  10. {
  11. public:
  12. MGraph(int vexNum, GraphKind __kind) : vexnum(vexNum), arcnum(0), kind(__kind)
  13. {
  14. //分配顶点向量数组
  15. vvec = new VertexType[vexnum];
  16. //动态分配二维数组, 注意二维数组的动态分配
  17. arcs = new ArcCell *[vexnum];
  18. for (int i = 0; i < vexnum; i++)
  19. {
  20. //为每一行动态分配空间
  21. arcs[i] = new ArcCell[vexnum];
  22. }
  23. }
  24. void Create()
  25. {
  26. switch (kind)
  27. {
  28. case DG:
  29. {
  30. CreateDG();    //构造一个有向图
  31. break;
  32. }
  33. case WDG:
  34. {
  35. CreateWDG();    //构造一个带权有向图
  36. break;
  37. }
  38. case UDG:
  39. {
  40. CreateUDG();    //构造一个无向图
  41. break;
  42. }
  43. case WUDG:
  44. {
  45. CreateWUDG();   //构造一个带权无向图
  46. break;
  47. }
  48. default:
  49. return;
  50. }
  51. }
  52. //初始化顶点数组和邻接矩阵
  53. void Init()
  54. {
  55. cout << "请输入每个顶点的关键字:" << endl;
  56. VertexType val;
  57. for (int i = 0; i < vexnum; i++)
  58. {
  59. cin >> val;
  60. vvec[i] = val;
  61. }
  62. for (int i = 0; i < vexnum; i++)
  63. {
  64. ArcCell ac;
  65. ac.adj = 0;
  66. ac.info = NULL;
  67. for (int j = 0; j < vexnum; j++)
  68. {
  69. arcs[i][j] = ac;
  70. }
  71. }
  72. }
  73. //构造一个有向图
  74. void CreateDG()
  75. {
  76. Init();
  77. int vhead, vtail;
  78. cout << "请依次输入每条边的开始顶点和结束顶点:" << endl;
  79. while (cin >> vhead >> vtail)
  80. {
  81. arcnum++;
  82. arcs[vhead][vtail].adj = 1;
  83. }
  84. }
  85. //构造一个带权有向图
  86. void CreateWDG()
  87. {
  88. Init();
  89. int vhead, vtail;
  90. InfoType w;
  91. cout << "请依次输入每条边的开始顶点和结束顶点和权值:" << endl;
  92. while (cin >> vhead >> vtail >> w)
  93. {
  94. arcnum++;
  95. arcs[vhead][vtail].adj = w;
  96. }
  97. }
  98. //构造一个无向图
  99. void CreateUDG()
  100. {
  101. Init();
  102. int vhead, vtail;
  103. cout << "请依次输入每条边的开始顶点和结束顶点:" << endl;
  104. while (cin >> vhead >> vtail)
  105. {
  106. arcnum += 2;
  107. arcs[vhead][vtail].adj  = 1;
  108. arcs[vtail][vhead].adj  = 1;
  109. }
  110. }
  111. //构造一个带权无向图
  112. void CreateWUDG()
  113. {
  114. Init();
  115. int vhead, vtail;
  116. InfoType w;
  117. cout << "请依次输入每条边的开始顶点和结束顶点和权值:" << endl;
  118. while (cin >> vhead >> vtail >> w)
  119. {
  120. arcnum += 2;
  121. arcs[vhead][vtail].adj = w;
  122. arcs[vtail][vhead].adj = w;
  123. }
  124. }
  125. void displayGraph()
  126. {
  127. cout << "总共有" << vexnum << "个顶点,"
  128. << arcnum << "条边" << endl;
  129. for (int i = 0; i < vexnum; i++)
  130. {
  131. cout << "第" << i+1 << "个顶点是:" << vvec[i]
  132. << "相邻的边有: ";
  133. for (int j = 0; j < vexnum; j++)
  134. {
  135. if (arcs[i][j].adj != 0)
  136. cout << vvec[j] << "(" << arcs[i][j].adj << ") ";
  137. }
  138. cout << endl;
  139. }
  140. }
  141. private:
  142. struct ArcCell
  143. {
  144. VRType adj;   //顶点关系类型。对于无权图,用1或0表示
  145. //表示相邻与否;对带权图,为权值类型
  146. InfoType info;  //该弧相关的信息的指针
  147. };
  148. VertexType *vvec;          //顶点向量
  149. ArcCell **arcs;    //邻接矩阵
  150. int vexnum;                       //图的当前顶点个数
  151. int arcnum;                       //图的弧数
  152. GraphKind kind;                   //图的种类标志
  153. };
  154. int main()
  155. {
  156. cout << "构造无向图:" << endl;
  157. MGraph<char, int, int> udgGraph(8, UDG);
  158. udgGraph.Create();
  159. udgGraph.displayGraph();
  160. cout << "构造带权无向图:" << endl;
  161. MGraph<char, int, int> wudgGraph(9, WUDG);
  162. wudgGraph.Create();
  163. wudgGraph.displayGraph();
  164. cout << "构造有向图:" << endl;
  165. MGraph<char, int, int> dgGraph(6, DG);
  166. udgGraph.Create();
  167. udgGraph.displayGraph();
  168. cout << "构造带权有向图:" << endl;
  169. MGraph<char, int, int> wdgGraph(6, WDG);
  170. wdgGraph.Create();
  171. wdgGraph.displayGraph();
  172. system("pause");
  173. return 0;
  174. }

运行了一个带权有向图:

2)邻接链表

[cpp] view plaincopy
  1. #include <iostream>
  2. using namespace std;
  3. //枚举类型,图的种类 DG:有向图;WDG:带权值的有向图;
  4. //UDG: 无向图;WUDG: 带权值的无向图
  5. enum GraphKind {DG, WDG, UDG, WUDG};
  6. template<typename VertexType, typename InfoType>
  7. class ALGraph
  8. {
  9. public:
  10. ALGraph(int verNum, GraphKind _kind)
  11. : vexnum(verNum), arcnum(0), kind(_kind)
  12. {
  13. for (int i = 0; i < MAX_VERTEX_NUM; i++)
  14. vertices[i].firstarc = NULL;
  15. }
  16. //构造图,进行选择
  17. void Create()
  18. {
  19. switch (kind)
  20. {
  21. case DG:
  22. {
  23. CreateDG();    //构造一个有向图
  24. break;
  25. }
  26. case WDG:
  27. {
  28. CreateWDG();    //构造一个带权有向图
  29. break;
  30. }
  31. case UDG:
  32. {
  33. CreateUDG();    //构造一个无向图
  34. break;
  35. }
  36. case WUDG:
  37. {
  38. CreateWUDG();   //构造一个带权无向图
  39. break;
  40. }
  41. default:
  42. return;
  43. }
  44. }
  45. //打印邻接链表
  46. void displayGraph()
  47. {
  48. for (int i = 0; i < vexnum; i++)
  49. {
  50. cout << "第" << i+1 << "个顶点是:" << vertices[i].data
  51. << " 邻接表为: ";
  52. ArcNode *arcNode = vertices[i].firstarc;
  53. while (arcNode != NULL)
  54. {
  55. cout << " -> " << vertices[arcNode->adjvex].data
  56. << "(" << arcNode->info << ")";
  57. arcNode = arcNode->nextarc;
  58. }
  59. cout << endl;
  60. }
  61. }
  62. private:
  63. //初始化邻接链表的表头数组
  64. void InitVertics()
  65. {
  66. cout << "请输入每个顶点的关键字:" << endl;
  67. VertexType val;
  68. for (int i = 0; i < vexnum; i++)
  69. {
  70. cin >> val;
  71. vertices[i].data = val;
  72. }
  73. }
  74. //插入一个表结点
  75. void insertArc(int vHead, int vTail, InfoType w)
  76. {
  77. //构造一个表结点
  78. ArcNode *newArcNode = new ArcNode;
  79. newArcNode->adjvex = vTail;
  80. newArcNode->nextarc = NULL;
  81. newArcNode->info = w;
  82. //arcNode 是vertics[vHead]的邻接表
  83. ArcNode *arcNode = vertices[vHead].firstarc;
  84. if (arcNode == NULL)
  85. vertices[vHead].firstarc = newArcNode;
  86. else
  87. {
  88. while (arcNode->nextarc != NULL)
  89. {
  90. arcNode = arcNode->nextarc;
  91. }
  92. arcNode->nextarc = newArcNode;
  93. }
  94. arcnum++;
  95. }
  96. //构造一个有向图
  97. void CreateDG()
  98. {
  99. InitVertics();
  100. int vhead, vtail;
  101. cout << "请依次输入每条边的开始顶点和结束顶点:" << endl;
  102. while (cin >> vhead >> vtail)
  103. {
  104. insertArc(vhead, vtail, 0);
  105. }
  106. }
  107. //构造一个带权有向图
  108. void CreateWDG()
  109. {
  110. InitVertics();
  111. int vhead, vtail;
  112. InfoType w;
  113. cout << "请依次输入每条边的开始顶点和结束顶点和权值:" << endl;
  114. while (cin >> vhead >> vtail >> w)
  115. {
  116. insertArc(vhead, vtail, w);
  117. }
  118. }
  119. //构造一个无向图
  120. void CreateUDG()
  121. {
  122. InitVertics();
  123. int vhead, vtail;
  124. cout << "请依次输入每条边的开始顶点和结束顶点:" << endl;
  125. while (cin >> vhead >> vtail)
  126. {
  127. insertArc(vhead, vtail, 0);
  128. insertArc(vtail, vhead, 0);
  129. }
  130. }
  131. //构造一个带权无向图
  132. void CreateWUDG()
  133. {
  134. InitVertics();
  135. int vhead, vtail;
  136. InfoType w;
  137. cout << "请依次输入每条边的开始顶点和结束顶点和权值:" << endl;
  138. while (cin >> vhead >> vtail >> w)
  139. {
  140. insertArc(vhead, vtail, w);
  141. insertArc(vtail, vhead, w);
  142. }
  143. }
  144. //const数据成员必须在构造函数里初始化
  145. static const int MAX_VERTEX_NUM = 20;  //最大顶点个数
  146. struct ArcNode          //表结点
  147. {
  148. int adjvex;        //该弧所指向的顶点的位置
  149. ArcNode *nextarc;  //指向下一条弧的指针
  150. InfoType info;     //该弧相关信息的指针
  151. };
  152. struct VNode           //头结点
  153. {
  154. VertexType data;    //顶点信息
  155. ArcNode *firstarc;  //指向第一条依附于该顶点的弧的指针
  156. };
  157. /*VNode AdjList[MAX_VERTEX_NUM];*/
  158. /* AdjList[MAX_VERTEX_NUM] vertices;*/
  159. VNode vertices[MAX_VERTEX_NUM];
  160. int vexnum;             //图的当前顶点数
  161. int arcnum;             //图的弧数
  162. GraphKind kind;         //图的种类
  163. };
  164. int main()
  165. {
  166. cout << "构造一个8个顶点的无向图:" << endl;
  167. ALGraph<char, int> udgGraph(8, UDG);
  168. udgGraph.Create();
  169. udgGraph.displayGraph();
  170. cout << "构造一个9个顶点的带权无向图:" << endl;
  171. ALGraph<char, int> wudgGraph(9, WUDG);
  172. wudgGraph.Create();
  173. wudgGraph.displayGraph();
  174. cout << "构造一个6个顶点的有向图:" << endl;
  175. ALGraph<char, int> dgGraph(6, DG);
  176. dgGraph.Create();
  177. dgGraph.displayGraph();
  178. cout << "构造一个9个顶点的带权有向图:" << endl;
  179. ALGraph<char, int> wdgGraph(9, WDG);
  180. wdgGraph.Create();
  181. wdgGraph.displayGraph();
  182. system("pause");
  183. return 0;
  184. }

图的表示方法和C++实现相关推荐

  1. 【高并发】又一个朋友面试栽在了Thread类的stop()方法和interrupt()方法上!

    来自:冰河技术 写在前面 新一轮的面试已经过去,可能是疫情的原因吧,很多童鞋纷纷留言说今年的面试题难度又提高了,尤其是对并发编程的知识.我细想了下,也许有那么点疫情的原因吧,但无论面试的套路怎么变,只 ...

  2. Java并发编程—schedule方法和scheduleAtFixedRate方法的区别

    原文作者:一叶丿清风 原文地址:schedule方法和scheduleAtFixedRate方法的区别 schedule方法和scheduleAtFixedRate方法都可以实现任务的延时和不延时执行 ...

  3. 基于水平集方法和G0模型的SAR图像分割

    基于水平集方法和G0模型的SAR图像分割 Abstract(摘要) 这篇文章提出了一种分割SAR图像的方法,探索利用SAR数据中的统计特性将图像分区域.我们假设为SAR图像分割分配参数,并与水平集模型 ...

  4. 计算机管理创建新用户,win7系统添加新用户名的方法和win7系统计算机管理中没有本地用户和组的解决方法...

    win7系统添加新用户名的方法 方法一:通过控制面板创建新的用户. 1.打开开始菜单,选择控制面板. 2.打开控制面板界面,选择用户账户. 3.进行用户设置界面,选择管理其它账户. 4.点击下面的创建 ...

  5. iOS-class方法和objc_getClass方法

    根据上一篇博客iOS-class.object_getClass.objc_getClass.objc_getMetaClass区别的研究发现,发现主要还是class方法和objc_getClass方 ...

  6. 【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享

    最近我们被客户要求撰写关于主成分分析PCA的研究报告,包括一些图形和统计输出.降维技术之一是主成分分析 (PCA) 算法,该算法将可能相关变量的一组观察值转换为一组线性不相关变量.在本文中,我们将讨论 ...

  7. Node.js的环境搭建方法和 npm 的使用方法

    Node.js的环境搭建方法和 npm 的使用方法 Node.js 环境的搭建 Node.js 介绍 Node.js 下载 配置Node.js node.js 测试 npm(包管理器)使用方法 npm ...

  8. 联想集群超算LICO初次使用踩坑说明(遇到的错误,一些使用方法和singularity新建容器方法)

    联想集群超算LICO初次使用踩坑说明(遇到的错误,一些使用方法和singularity新建容器方法) 说明 本文主要写一些我这几天初次使用LICO的过程中遇到的一点问题和解决的办法,还有一些模块的规范 ...

  9. PIL库中Image类thumbnail方法和resize方法区别

    from PIL import Image   im=Image.open("C:\\Users\\kethur\\Desktop\\a.jpg") x,y=im.size pri ...

最新文章

  1. Vivado如何计算关键路径的建立时间裕量?(理论分析篇)
  2. tensorflow+python flask进行手写识别_使用tensorflow进行手写数字识别
  3. 企业级自动化运维神器Ansible
  4. iphone怎么查看wifi密码_WiFi密码忘了怎么办?一秒找回密码
  5. Google Maps 补丁绕过、得双倍奖金这么简单?我陷入了自我怀疑
  6. C++ 设计模式 —— 控制器设计模式(实现功能模块间通信)
  7. Asp.net 调用sqlserver存储过程参数传中文乱码!
  8. ORACLE11g数据库安装-刘建-专题视频课程
  9. 2022年个人如何申请微信H5支付接口?
  10. 2020年,拥抱不平凡
  11. ❤️UI自动化轻松解决微信手工群发消息的烦恼❤️
  12. c语言大作业之自动寄存柜,关于自动寄存柜的问题求解
  13. 【FTP】Entering Extended Passive Mode
  14. 《大明王朝》雪崩前,精英们的狂欢
  15. 阿里执行副主席蔡崇信投资NBA篮网队;工信部约谈运营商,不得限制用户资费选择丨价值早报
  16. [zz]Freeware, Open source and Commercial Website Security Tools and Services
  17. 为什么要使用flowable工作流
  18. android仿苹果悬浮窗,Android仿IOS悬浮拖动按钮
  19. 商城项目(四)整合SpringTask实现定时任务
  20. 【报告分享】DTC品牌私域用户运营手册-易观方舟(附下载)

热门文章

  1. JAVA入门级教学之(标识符与关键字)
  2. c 程序中的注释相当于空白字符_Python专题 | (三)注释、变量与输出
  3. 计算机二级必备快捷键知识,计算机二级考试中的一些注意事项️
  4. java面向对象多态特性
  5. Java的重载与覆盖,傻傻分不清!
  6. 干货丨总结5类面试官特点和应对方法
  7. python反序列化总结_单例模式的反序列化总结
  8. python第八周小测验_Python语言程序设计第2周测验+练习题复盘
  9. 劲乐团u显示服务器维护,劲乐团9YOU原版服务端架设教程
  10. android 分享到豆瓣,Android项目总结之社会化分享