数据结构-图及其遍历

图-邻接矩阵

#include<iostream>
#define MAX_VERTS 20
using namespace std;
//邻接矩阵 浪费空间class Vertex {  //顶点
public:Vertex(char lab) { Label = lab; }
private:char Label;
};class Graph {   //图
public:Graph();~Graph();void addVertex(char lab);void addEdge(int start, int end);void printMatrix();
private:Vertex* vertexList[MAX_VERTS];int nVerts;int adjMat[MAX_VERTS][MAX_VERTS];
};
Graph::Graph()
{nVerts = 0;for (int i = 0; i < MAX_VERTS; i++){for (int j = 0; j < MAX_VERTS; j++){adjMat[i][j] = 0;}}
}void Graph::addVertex(char lab)
{vertexList[nVerts++] = new Vertex(lab);
}void Graph::addEdge(int start,int end)
{adjMat[start][end] = 1;adjMat[end][start] = 1;
}void Graph::printMatrix()
{for (int i = 0; i < nVerts; i++){for (int j = 0; j < nVerts; j++){cout<<adjMat[i][j] <<" ";}cout << endl;}}
Graph::~Graph()
{for (int i = 0; i < nVerts; i++){delete vertexList[i];   //vertexList[i]内为指针}
}int main()
{Graph g;g.addVertex('A');   //0g.addVertex('B');   //1g.addVertex('C');   //2g.addVertex('D');   //3g.addVertex('E');   //4g.addEdge(0, 1);    //A-Bg.addEdge(0, 3);    //A-Dg.addEdge(1, 0);    //B-A g.addEdge(1, 4);    //B-E 和 E-B会不会重复g.addEdge(2, 4);    //C-Eg.addEdge(3, 0);	//D-Ag.addEdge(3, 4);	//D-Eg.addEdge(4, 1);	//E-Bg.addEdge(4, 2);	//E-Cg.addEdge(4, 3);	//E-Dg.printMatrix();system("pause");return 0;
}

 

图-邻接表

#include<iostream>
#include<list>
using namespace std;
class Vertex {};template<class T>
class Graph {
private:T** VertexList;  //存顶点的数组list<int>* HeadNodes;  int n; //顶点个数int nVerts;  //计数顶点数
public:Graph(const int vertices) :n(vertices){VertexList = new T*[n]; //n个数组HeadNodes = new list<int>[n];   //n个链表分别存在n个数组里nVerts = 0;}~Graph(){delete[] VertexList;delete[] HeadNodes;}void addVertext(T* v);void addEdge(int start, int end);void printVertice();void printAdjList();};template<class T>
void Graph<T>::addVertext(T* v)
{VertexList[nVerts++] = v;
}template<class T>
void Graph<T>::addEdge(int start,int end)
{HeadNodes[start].push_back(end);
}template<class T>
void Graph<T>::printVertice()
{for (int i = 0; i < nVerts; i++){cout << *VertexList[i] << " ";}cout << endl;
}
template<class T>
void Graph<T>::printAdjList()
{for (int i = 0; i < nVerts; i++){cout << i << "->";for (list<int> ::iterator iter = HeadNodes[i].begin(); iter != HeadNodes[i].end();++iter){cout << *iter << "->";}cout << "end" << endl;;}}int main()
{Graph<char> g(5);char a = 'A';char b = 'B';char c = 'C';char d = 'D';char e = 'E';g.addVertext(&a);g.addVertext(&b);g.addVertext(&c);g.addVertext(&d);g.addVertext(&e);g.printVertice();g.addEdge(0, 1);    //A-Bg.addEdge(0, 3);    //A-Dg.addEdge(1, 0);    //B-A g.addEdge(1, 4);    //B-E 和 E-B会不会重复g.addEdge(2, 4);    //C-Eg.addEdge(3, 0);	//D-Ag.addEdge(3, 4);	//D-Eg.addEdge(4, 1);	//E-Bg.addEdge(4, 2);	//E-Cg.addEdge(4, 3);	//E-Dg.printAdjList();system("pause");return 0;
}

图的搜索

                                   

图-DFS深度优先搜索

只有有下一个结点就一直往下走,知道没有再往回走

 

图-BFS广度优先搜索

一层一层搜索

#include<iostream>
#include<stack>
#include<queue>
#define MAX_VERTS 20
using namespace std;
//邻接矩阵 浪费空间class Vertex {  //顶点
public:Vertex(char lab) { Label = lab; wasVisited = false;}
public:bool wasVisited;char Label;};class Graph {   //图
public:Graph();~Graph();void addVertex(char lab);void addEdge(int start, int end);void printMatrix();void showVertex(int v);void DFS();void BFS();
private:Vertex* vertexList[MAX_VERTS];int nVerts;int adjMat[MAX_VERTS][MAX_VERTS];int getAdjUnvisitedVertex(int v);
};
void Graph::DFS()
{stack<int> gStack;  //保存顶点下标vertexList[0]->wasVisited = true;showVertex(0);gStack.push(0);int v;while (gStack.size() > 0){v = getAdjUnvisitedVertex(gStack.top());if (v==-1){gStack.pop();}else{vertexList[v]->wasVisited = true;showVertex(v);gStack.push(v);}}cout << endl;for (int j = 0; j < nVerts; j++){vertexList[j]->wasVisited = false;}
}
void Graph::BFS()
{queue<int> gQueue;vertexList[0]->wasVisited = true;showVertex(0);gQueue.push(0);int vert1, vert2;while (gQueue.size() > 0){vert1 = gQueue.front();gQueue.pop();vert2 = getAdjUnvisitedVertex(vert1);while (vert2 != -1){vertexList[vert2]->wasVisited = true;showVertex(vert2);gQueue.push(vert2);vert2 = getAdjUnvisitedVertex(vert1);}}cout << endl;for (int i = 0; i < nVerts; i++){vertexList[i]->wasVisited = false;}
}
int Graph::getAdjUnvisitedVertex(int v)
{for (int i = 0; i < nVerts; i++){if ((adjMat[v][i] == 1) && (vertexList[i]->wasVisited == false))return i;}return -1;
}
void Graph::showVertex(int v)
{cout << vertexList[v]->Label << "  ";
}
Graph::Graph()
{nVerts = 0;for (int i = 0; i < MAX_VERTS; i++){for (int j = 0; j < MAX_VERTS; j++){adjMat[i][j] = 0;}}
}void Graph::addVertex(char lab)
{vertexList[nVerts++] = new Vertex(lab);
}void Graph::addEdge(int start,int end)
{adjMat[start][end] = 1;adjMat[end][start] = 1;
}void Graph::printMatrix()
{for (int i = 0; i < nVerts; i++){for (int j = 0; j < nVerts; j++){cout<<adjMat[i][j] <<" ";}cout << endl;}}
Graph::~Graph()
{for (int i = 0; i < nVerts; i++){delete vertexList[i];   //vertexList[i]内为指针}
}int main()
{Graph g;g.addVertex('A');   //0g.addVertex('B');   //1g.addVertex('C');   //2g.addVertex('D');   //3g.addVertex('E');   //4g.addEdge(0, 1);    //A-Bg.addEdge(0, 3);    //A-Dg.addEdge(1, 0);    //B-A g.addEdge(1, 4);    //B-E 和 E-B会不会重复g.addEdge(2, 4);    //C-Eg.addEdge(3, 0);	//D-Ag.addEdge(3, 4);	//D-Eg.addEdge(4, 1);	//E-Bg.addEdge(4, 2);	//E-Cg.addEdge(4, 3);	//E-Dg.printMatrix();cout << "深度优先搜索的结果:";g.DFS();cout << "广度优先搜索的结果:";g.BFS();system("pause");return 0;
}

 运行结果:

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ios http长连接_Nginx篇05——http长连接和keeplive

nginx中http模块使用http长连接的相关配置(主要是keepalive指令)和http长连接的原理解释。1、http长连接1.1 预备知识连接管理是一个 HTTP 的关键话题&#xff1a;打开和保持连接在很大程度上影响着网站和 Web 应用程序的性能。在 HTTP/1.x 里有多种模型&#xff1a;短连接, 长…

php 目录555 权限_CMS网站安全权限划分设置教程

DiYunCMS(帝云CMS)-免费开源可商用的PHP万能建站程序CMS网站安全权限划分设置教程网站安全是网站搭建运营过程中非常重要的一部分&#xff0c;DiYunCMS非常注重安全&#xff0c;开发了强大的安全功能。本文给大家介绍下DiYunCMS网站的安全设置方法。首先需要安装【系统安全】插…

python使用os.listdir和os.walk获得文件的路径

目录 情况1&#xff1a;在一个目录下面只有文件&#xff0c;没有文件夹&#xff0c;这个时候可以使用os.listdir情况2&#xff1a;递归的情况&#xff0c;一个目录下面既有目录也有文件&#xff0c;使用os.walk&#xff1a; os.walk介绍&#xff1a;如何获得一个路径下面所有的…

mac 用yum命令安装mysql_cenos6.4使用yum命令安装mysql

1.查看系统中有没有mysql安装包&#xff0c;命令如下&#xff1a;yum list mysql*如果有需要使用yum remove 文件名 移除已安装的mysql文件2.查看系统中是否还有其他的mysql文件存在&#xff0c;命令如下&#xff1a;rpm -qa|grep mysql如果有使用rpm -e 文件名 进行卸载3.分别…

python 列表生成式

python笔记21-列表生成式 前言 python里面[]表示一个列表&#xff0c;快速生成一个列表可以用range()函数来生成。 对列表里面的数据进行运算和操作&#xff0c;生成新的列表最高效快速的办法&#xff0c;那就是列表生成式了。 range() 1.一个连续的数字类型列表&#xff0…

php mysql grant_mysql grant命令详解_MySQL

bitsCN.comgrant 权限 on 数据库对象 to 用户一、grant 普通数据用户&#xff0c;查询、插入、更新、删除 数据库中所有表数据的权利。grant select on testdb.* to common_user%grant insert on testdb.* to common_user%grant update on testdb.* to common_user%grant delet…

python中yield的用法详解——最简单,最清晰的解释

首先&#xff0c;如果你还没有对yield有个初步分认识&#xff0c;那么你先把yield看做“return”&#xff0c;这个是直观的&#xff0c;它首先是个return&#xff0c;普通的return是什么意思&#xff0c;就是在程序中返回某个值&#xff0c;返回之后程序就不再往下运行了。看做…

python matplotlib简单使用

一、简单介绍 Matplotlib是Python的一个绘图库&#xff0c;是Python中最常用的可视化工具之一。 二、安装方法 安装方法&#xff1a;pip install matplotlib 注意&#xff1a;安装matplotlib前需要先安装numpy才可以 三、基本绘图命令 1、plt.fig([num]) 在绘图过程中&a…

python窗体设计插件_Python 界面生成器 wxFormBuilder 的入门使用(wxPython的界面设计工具的初学笔记)...

环境&#xff0c;Win10&#xff0c;python3.7.3&#xff0c;wxPython 4.0.4&#xff0c;wxFormBuilder 3.91、准备一个窗体。点击wxformbuilder上方的标签“forms”&#xff0c;并点击标签下方的第一个类似窗体的图标“Frame”然后&#xff0c;下面就会出现一个窗体。但是现在还…

mysql配置性能_MySQL配置性能优化

下面配置的优化&#xff0c;可能影响比较大&#xff0c;可能可以显著提高读写性能。1、mysql一些主要配置项介绍&#xff1a;innodb_buffer_pool_size这是你安装完InnoDB后第一个应该设置的选项。缓冲池是数据和索引缓存的地方&#xff1a;这个值越大越好&#xff0c;这能保证你…

用cmd编译c++程序

1、设置好环境变量&#xff08;已安装vs&#xff09; ①在计算机的系统环境变量--》用户变量--》path中添加 D:\VS15\VC\bin ②新建变量INCLUDE&#xff1a;D:\VS15\VC\include ③新建变量LIB&#xff1a;D:\VS15\VC\lib 2、利用cl编译c文件 打开cmd 输入c…

C++编译运行过程分析

为了减轻使用机器语言编程的痛苦&#xff0c;人们进行了一种有益的改进&#xff1a;用一些简洁的英文字母、符号串来替代一个特定的指令的二进制串&#xff0c;比如&#xff0c;用“A D D”代表加法&#xff0c;“M O V”代表数据传递等等&#xff0c;这样一来&#xff0c;人们…

mysql给用户授权最大_mysql 给用户授权

MySQL用户授权 GRANT 语句的语法如下&#xff1a; GRANT privileges (columns) ON what TO user IDENTIFIEDBY "password" WITH GRANT OPTION 对用户授权 mysql>grant rights on database.* to userhost identified by &qu…

python插入排序_直接插入排序(python实现)

这篇博文用来介绍直接插入排序直接插入排序基本思想&#xff1a;每次将一个待排序的记录插入到已经排好序的数据区中&#xff0c;直到全部插入完为止直接插入排序算法思路&#xff1a;在直接插入排序中&#xff0c;数据元素分为了有序区和无序区两个部分&#xff0c;在这里我们…

STL1-函数模板

1、函数模板和普通函数区别 //普通函数可以进行自动类型转换&#xff0c; //函数模板必须精确类型匹配; //函数模板可以被重载;c优先考虑普通函数;#include<iostream> using namespace std; //函数模板-->产生模板函数-->调用函数 template<class T> T MyAd…

ruby 安装mysql_ruby安装mysql

ruby安装mysqlruby on rails安装mysql数据库1. 下载mysql软件http://www.mysql.cn/mysql中文官方网站下载安装软件&#xff0c;选择5.02. 安装mysql&#xff0c;设置默认字符集为utf-83. 下载mysql for ruby的驱动并安装http://rubyforge.org/搜索mysql&#xff0c;找到mysql -…

jupyter安装与迁移文件

1、安装 pip install jupyter notebook -i https://pypi.tuna.tsinghua.edu.cn/simple 2、测试安装成功 安装完后输入 jupyter notebook 出现一个jupyter网址&#xff0c;即证明安装成功 3、数据迁移 将之前的jupyter notebook产生的文件复制在python所安装的盘目录下。然…

修正的判定条件覆盖例题_语句覆盖、判断覆盖、条件覆盖、条件判定组合覆盖、多条件覆盖、修正条件覆盖...

int function(bool a,bool b,boolc){intx;x0;if(a&&(b||c)){x1;returnx;}}1、语句覆盖(SC)选择足够多的测试数据&#xff0c;使得被测程序中的每条语句至少执行一次。测试用例&#xff1a;aT,bT,cT2、判断覆盖(DC)设计足够的测试用例&#xff0c;使得程序中的每个判定至…

STL2-类模板

1、类模板实现 函数模板在调用时可以自动类型推导 类模板必须显式指定类型 #include<iostream> using namespace std;template<class T> class Person { public:T mId;T mAge; public:Person(T id,T age){this->mAge age;this->mId id;}void Show(){cout…

STL3-MyArray动态数组类模板实现

注意 1、右值的拷贝使用 2、拷贝构造函数的使用 #include<iostream> using namespace std;template<class T> class MyArray{ public:MyArray(int capacity){this->mCapacity capacity;this->mSize 0;//申请内存this->pAddr new T[this->mCapac…