数据结构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 ...
随机推荐
- 问题:win10缺少一个或多个网络协议
国庆回家,家里电脑连不上网了,诊断给出的结果是“缺少一个或多个网络协议” 网上这类问题提问的不少,回答的方法也是各种各样,一个一个试下来,发现这个方法是可行的. 1.打开设置--网络和Internet ...
- Ubuntu18.04安装Docker并部署(编译、发布、构建镜像)Asp.NetCore项目全过程笔记
环境准备:阿里云Ubuntu18.04 全新安装 一.安装Docker 1.删除旧版本并更新包索引: sudo apt-get remove docker docker-engine dock ...
- python和java哪个更值得学?Python会超越Java吗?
Java快死了吗?当然不是.但是Python的普及率每年都在增长.每个都有自己的优点和缺点,并且两者都是值得了解的. 根据IT编程趋势,就工作数量,现有Java开发人员的数量以及IT中的总体使用情况而 ...
- 高效C++:定制new和delete
内存的申请和释放,C++从语言级别提供了new和delete关键字,因此需要了解和熟悉其中的过程. 了解new-handler的行为 set_new_handler可以指定一个函数,当申请内存失败时调 ...
- 写给程序员的机器学习入门 (八) - 卷积神经网络 (CNN) - 图片分类和验证码识别
这一篇将会介绍卷积神经网络 (CNN),CNN 模型非常适合用来进行图片相关的学习,例如图片分类和验证码识别,也可以配合其他模型实现 OCR. 使用 Python 处理图片 在具体介绍 CNN 之前, ...
- CAS实现SSO 单点登录
结构 CAS分为两部分,CAS Server和CAS Client CAS Server用来负责用户的认证工作,就像是把第一次登录用户的一个标识存在这里,以便此用户在其他系统登录时验证其需不需要再次登 ...
- Mybatis(六)逆向工程generator
逆向工程概述: MyBatis的一个主要的特点就是需要程序员自己编写sql,那么如果表太多的话,难免会很麻烦,所以mybatis官方提供了一个逆向工程,可以针对单表自动生成mybatis执行所需要的代 ...
- HTTP的实体数据
数据类型表示实体数据的内容是什么,使用的是MIME type,相关的头字段是Accept和Content-Type: text:即文本格式的可读数据,我们最熟悉的应该就是text/html ...
- VIM的常用快捷方式(尽量简洁,删去能组合实现的且不易记的)
vi可以分为三种状态,分别是一般模式.编辑模式和命令行模式 1一般模式:以vi打开一个文件就直接进入一般模式了(这是默认的模式).在这个模式中, 你可以使用上下左右按键来移动光标,你可以使用删除字符或 ...
- 缓存利器、Lua模块下的共享内存
上一节讲到了worker进程的共享内存,它利用丰富的指令使数据的缓存操作变得非常简单,但它也存在一些缺点. 1.worker进程之间会有锁竞争,在高并发的情况下会增加性能开销.2.只支持Lua布尔值. ...