数据结构C++实现邻接矩阵存储图
定义邻接矩阵存储的图类。
[实验要求]
1. 创建一个邻接矩阵存储的图;
2. 返回图中指定边的权值;
3. 查找图中某顶点的第一个邻接顶点、某顶点关于另一个顶点的下一个邻接顶点序号;
4. 图的深度优先遍历;
[截图]
1. 实验例图
2.操作截图
[实现代码]
一共有三个文件Graph_Martix.h、Graph_Martix.cpp和main.cpp
- Graph_Martix.h
- #ifndef _GRAPH_MARTIX_H
- #define _GRAPH_MARTIX_H
- #include <iostream>
- using namespace std;
- const int MaxGrzphSize=; //图的最大顶点个数
- const int MaxWeight=; //图中允许的最大权值
- class Graph_Martix
- {
- private:
- int edge[][];
- int graphsize;
- public:
- Graph_Martix();
- int GetWeight(const int v1,const int v2);
- int GetFirstNeighbor(const int v);
- void GetAllNeighbor(const int v);
- int GetNextNeighbor(const int v1,const int v2);
- void DepthFirstSearch(int v);
- void RDFS(const int v,int *visited);
- };
- #endif
- Graph_Martix.cpp
- #include "Graph_Martix.h"
- Graph_Martix::Graph_Martix() {
- cout<<"请输入邻接矩阵节点个数"<<endl;
- cin>>graphsize;
- cout<<"请输入各个节点之间的权值:"<<endl;
- for(int i=;i<graphsize;i++){
- for(int j=;j<graphsize;j++){
- cin>>edge[i][j];
- }
- }
- }
- int Graph_Martix::GetWeight(const int v1,const int v2){
- if(v1==-||v2==-)
- return -;
- else
- return edge[v1][v2];
- }
- int Graph_Martix::GetFirstNeighbor(const int v){
- if (v==-) return -;
- for(int i=;i<graphsize;i++){
- if(edge[v][i]>&&edge[v][i]<MaxWeight)
- return i;
- }
- return -;//若v没有邻接顶点,则返回-1.
- }
- void Graph_Martix::GetAllNeighbor(const int v) {
- if(v==-) return;
- for(int i=;i<graphsize;i++){
- if(edge[v][i]>&&edge[v][i]<MaxWeight){
- cout<<i;
- }
- }
- }
- int Graph_Martix::GetNextNeighbor(const int v1,const int v2) {
- if(v1==-||v2==-) return -;
- for(int i=v2+;i<graphsize;i++)
- if(edge[v1][i]>&&edge[v1][i]<MaxWeight)
- return i;
- return -; //若在v2之后没有与v1邻接的顶点,则返回-1.
- }
- void Graph_Martix::RDFS(const int v,int *visited)
- {
- cout<<v<<" "; //输出v的序号
- visited[v]=; //说明v已被访问过
- int w=GetFirstNeighbor(v); //取得v的第一个邻接顶点的序号
- while(w!=-) //若存在顶点w
- {
- if(!visited[w]) //若w未被访问过,从w递归访问
- RDFS(w,visited);
- w=GetNextNeighbor(v,w); //w为v关于w的下一个邻接顶点
- }
- }
- void Graph_Martix::DepthFirstSearch(int v)
- {
- int *visited=new int[graphsize]; //为辅助数组申请空间
- for(int k=;k<graphsize;k++)
- visited[k]=;
- RDFS(v,visited); //从序号为0的节点出发,深度优先遍历
- delete[]visited; //释放辅助数组空间
- }
- main.cpp
- #include <iostream>
- #include "Graph_Martix.h"
- #include "Graph_Martix.cpp"
- using namespace std;
- int main(){
- Graph_Martix a;
- int b,c,d,e,f,g;
- while(){
- cout<<"请输入要执行的操作"<<endl;
- cout<<"0.退出"<<endl;
- cout<<"1.获取指定权值"<<endl;
- cout<<"2.获取该点全部邻接顶点"<<endl;
- cout<<"3.深度遍历"<<endl;
- cin>>c;
- switch(c){
- case :
- exit();
- break;
- case :
- cout<<"请输入该边的起点,终点"<<endl;
- cin>>d>>e;
- b=a.GetWeight(d,e);
- if(b==-){
- cout<<"边不存在"<<endl;
- }
- cout<<b<<endl;
- break;
- case :
- cout<<"请输入顶点序号"<<endl;
- cin>>f;
- a.GetAllNeighbor(f);
- break;
- case :
- cout<<"请输入选择哪个顶点开始深度遍历"<<endl;
- cin>>g;
- a.DepthFirstSearch(g);
- cout<<endl;
- break;}}
- return ;
- }
数据结构C++实现邻接矩阵存储图的更多相关文章
- PTA 邻接矩阵存储图的深度优先遍历
6-1 邻接矩阵存储图的深度优先遍历(20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)( ...
- 数据结构(11) -- 邻接表存储图的DFS和BFS
/////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...
- 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)
一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...
- 数据结构之---C语言实现图的邻接表存储表示
// 图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #include <string.h> #defi ...
- 图的bfs遍历模板(邻接矩阵存储和邻接表存储)
bfs遍历图模板伪代码: bfs(u){ //遍历u所在的连通块 queue q; //将u入队 inq[u] = true; while (q非空){ //取出q的队首元素u进行访问 for (从u ...
- 邻接矩阵实现图的存储,DFS,BFS遍历
图的遍历一般由两者方式:深度优先搜索(DFS),广度优先搜索(BFS),深度优先就是先访问完最深层次的数据元素,而BFS其实就是层次遍历,每一层每一层的遍历. 1.深度优先搜索(DFS) 我一贯习惯有 ...
- 数据结构Java版之邻接矩阵实现图(十一)
邻接矩阵实现图,是用一个矩阵,把矩阵下标作为一个顶点,如果顶点与顶点之间有边.那么在矩阵对应的点上把值设为 1 .(默认是0) package mygraph; import java.util.Li ...
- java数据结构_笔记(4)_图
图一.概念.图: 是一种复杂的非线性数据结构.图的二元组定义: 图 G 由两个集合 V 和 E 组成,记为:G=(V, E) 其中: V 是顶点的有穷非空集合,E 是 V 中顶点偶对(称为边)的有穷 ...
- c++邻接表存储图(无向),并用广度优先和深度优先遍历(实验)
一开始我是用c写的,后面才发现广搜要用到队列,所以我就直接使用c++的STL队列来写, 因为不想再写多一个队列了.这次实验写了两个多钟,因为要边写边思考,太菜了哈哈. 主要参考<大话数据结构&g ...
随机推荐
- 机器学习 | SVD矩阵分解算法,对矩阵做拆分,然后呢?
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题第28篇文章,我们来聊聊SVD算法. SVD的英文全称是Singular Value Decomposition,翻译过来 ...
- mybatis的<if>标签,<foreach>标签,<collection>标签,<association>标签以及useGeneratedKeys用法
<if>标签 1.判断非空或不等于 <if test="assessTypes!= null and assessTypes!='' "> AND FIND ...
- vue 表格使用el-select
<el-table-column label="示例" width="210" align="center"> <temp ...
- smartJQueryZoom(smartZoom) 的使用方法
smartZoom 是一个我很喜欢用的库. 但是这个库有一些不完善的地方. 比如BUG. 比如使用上可能遇到的问题. <article> <div id="zoom_box ...
- JAVA集合二:HashMap和Hashtable
参考链接: HOW2J.CN HashMap HashMap实现了JAVA的Map接口,类似于C++的STL框架的Map,是存储键值对的数据结构.键(key)是唯一的,但值(value)可以重复,如果 ...
- python numpy库np.percentile用法说明
在python中计算一个多维数组的任意百分比分位数,此处的百分位是从小到大排列,只需用np.percentile即可…… a = range(1,101) #求取a数列第90%分位的数值 np.per ...
- 05 . ELK Stack+Redis日志收集平台
环境清单 IP hostname 软件 配置要求 网络 备注 192.168.43.176 ES/数据存储 elasticsearch-7.2 内存2GB/硬盘40GB Nat,内网 192.168. ...
- jenkins集群(二)(master --> slave) -- allure自动化测试报告部署
一.前提 1.环境 1)已经部署好了jenkins环境,包括jenkins的“全局工具配置”也配好了. 2.master与slave的简单的概念 1)master:jenkins部署所在的机器 2)s ...
- ⛅剑指 Offer 11. 旋转数组的最小数字
20207.22 LeetCode 剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小 ...
- express中post请求模块
body-parser模块主要解析post接口请求 1.npm install body-parser -S 2.server.js中引用 const bodyParser=require('bo ...