数据结构-图及其遍历

图-邻接矩阵

#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 列表生成式

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 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;下面就会出现一个窗体。但是现在还…

用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…

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

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

STL1-函数模板

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

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…

mysql udf提权hex_Mysql_UDF提权

Mysql_UDF提权作者&#xff1a;admin 发布于&#xff1a;2013-5-25 18:55 Saturday分类&#xff1a;MYSQLRoot权限一、上传udf.dll小于mysql5.1版本C:\\WINDOWS\\udf.dll 或C:\\WINDOWS\\system32\\udf.dll等于mysql5.1版本%mysql%\\plugin\\udf.dll 用 selectplugin_dir 查询…

STL4-类型转换

#include<iostream> using namespace std;class Building{}; class Animal{}; class Cat :public Animal {}; //Cat是Animal的子类//static_cast //用于内置的数据类型及具有继承关系的指针或者引用 void test01() {int a 97;//static_cast<要转换的类型>(转换的…

python argparse模块

argparse模块 argparse是python用于解析命令行参数和选项的标准模块&#xff0c;用于代替已经过时的optparse模块 使用步骤 import argparse # 1 导入模块&#xff0c;这个没什么说的 parser argparse.ArgumentParser() # 2 实例化一个对象&#xff0c;默认参数一堆&#…

STL5-异常

异常可以跨函数 异常必须处理 1、 #include<iostream> using namespace std; //c异常机制 跨函数 //c异常必须处理 不能留&#xff0c;否则报错 int divided(int x, int y) {if (y 0)throw y; //抛异常return (x / y); } void test01() {int x 10, y 0;//试着去捕获…

java 并发组件_Java 并发计数组件Striped64详解

作者&#xff1a; 一字马胡转载标志 【2017-11-03】更新日志日期更新内容备注2017-11-03添加转载标志持续更新Java Striped64Striped64是在java8中添加用来支持累加器的并发组件&#xff0c;它可以在并发环境下使用来做某种计数&#xff0c;Striped64的设计思路是在竞争激烈的时…

ubuntu的MySQL远程数据库连接问题查找

1、开放端口3306 2、添加权限 3、服务器本身没有在安全组规则中开放权限 添加安全组规则后重试。

java中集合怎么定义_Java集合系列(一):集合的定义及分类

1. 集合的定义什么是集合呢&#xff1f;定义&#xff1a;集合是一个存放对象的引用的容器。在Java中&#xff0c;集合位于java.util包下。2. 集合和数组的区别(面试常问)提到容器&#xff0c;就会想起数组&#xff0c;那么集合和数组的区别是什么呢&#xff1f;(这里是重点&…