数据结构(七)图的遍历(递归非递归方法)

图的遍历(递归非递归方法)

#include<iostream>
#include<stdio.h>
#include<stack>
#include<queue>
using namespace std;typedef char VertexType;
typedef int EdgeType;#define MAXVEX 100
#define INF 65535
bool visited[MAXVEX] ;typedef struct Graph
{VertexType vexs[MAXVEX];   //顶点表EdgeType arc[MAXVEX][MAXVEX]; // 邻接矩阵,边表int vexnum, arcnum;		      //图的当前顶点数和弧数
}MGraph;void CreateGraph(MGraph* Graph)
{cout << "请输入顶点数和边数:"<<endl;cin >> Graph->vexnum >> Graph->arcnum;//请输入顶点cout << "请输入顶点" << endl;for (int i = 0; i < Graph->vexnum; i++){cin >> Graph->vexs[i];}//初始化邻接矩阵for (int i = 0; i < Graph->vexnum; i++){for (int j = 0; j < Graph->vexnum; j++){Graph->arc[i][j] = INF;}}//输入边cout << "请输入边:" << endl;for (int i = 0; i < Graph->arcnum; i++){int x, y, v;cin >> x >> y >> v;Graph->arc[x][y] = v;Graph->arc[y][x] = v;}}void print_graph(MGraph* G)
{for (int i = 0; i < G->vexnum; i++){for (int j = 0; j < G->vexnum; j++){cout << G->arc[i][j] << "\t";}cout << "\n";}}//深度遍历(递归)
void DFS(const MGraph* G, int i)
{visited[i] = true;cout << i << "\t";for (int j = 0; j < G->vexnum; j++){if (!visited[j] && G->arc[i][j] != INF ){DFS(G, j);}}
}//深度遍历(非递归)
void DFS01(const MGraph* G, int i)
{visited[i] = true;stack<int> s;s.push(i);while (!s.empty()){i = s.top();s.pop();cout << i << "\t";for (int j = 0; j < G->vexnum; j++){if (!visited[j] && G->arc[i][j] != INF){visited[j] = true;s.push(j);}}}}//广度遍历
void BFS(const MGraph* G, int i)
{queue<int> Q;Q.push(i);visited[i] = true;while (!Q.empty()){//出队列i = Q.front();Q.pop();cout << i << "\t";//入队列for (int j = 0; j < G->vexnum; j++){if (!visited[j] && G->arc[i][j] != INF){visited[j] = true;Q.push(j);}}}}
int main()
{MGraph* G = new MGraph;CreateGraph(G);print_graph(G);BFS(G, 0);}

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

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

相关文章

Linux IO复用区别与epoll详解

转载&#xff1a;http://blog.csdn.net/hacker00011000/article/details/52160590 一、select、poll、epoll之间的区别总结[整理]   select&#xff0c;poll&#xff0c;epoll都是IO多路复用的机制。I/O多路复用就通过一种机制&#xff0c;可以监视多个描述符&#xff0c;一…

简单图和多重图

一、简单图    ① 不存在重复边&#xff1b;    ② 不存在顶点到自身的边&#xff1b; 二、多重图   ① 某两结点之间边数多于一条&#xff1b;   ② 允许顶点通过一条边和自己关联&#xff1b;

C++笔记:select多路复用机制

转载&#xff1a;http://blog.csdn.net/qdx411324962/article/details/42499535 函数作用&#xff1a; 系统提供select函数来实现多路复用输入/输出模型。select系统调用是用来让我们的程序监视多个文件句柄的状态变化的。程序会停在select这里等待&#xff0c;直到被监视的文件…

交叉编译执行应用程序出现:No such file or directory

问题分析 当我在arm板子上执行交叉编译过的程序的时候发现了这个错误。通过百度查询基本都是缺少32位库什么的,但是都不能解决问题。 然后我用ll指令&#xff0c;也排除了权限的原因。 我们用ldd指令发现&#xff0c;它不是动态执行的&#xff0c;虽然我们可以使用-static指…

select、poll、epoll 比较

转载&#xff1a;http://blog.csdn.net/dodo_328/article/details/39081183 1.Selet&#xff1a;本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。 缺点&#xff1a;1 单个进程可监视的fd数量被限制&#xff0c;因为受描述符集合fd_set限制&#xff0c;fd数量…

C库函数 File

C库函数常用的有&#xff1a;fopen, fclose, fread, fwrite, fgets, fputs, fscanf, fprintf, fseek, fgetc, fputc, ftell, feof, flush等&#xff0c; 当使用fopen打开一个文件时通常返回一个文件指针 FILE *fp。FILE类型是一个结构体&#xff0c;包含文件描述符&#xff08;…

Unix 网络编程(四)- 典型TCP客服服务器程序开发实例及基本套接字API介绍

转载&#xff1a;http://blog.csdn.net/michael_kong_nju/article/details/43457393 写在开头&#xff1a; 在上一节中我们学习了一些基础的用来支持网络编程的API&#xff0c;包括“套接字的地址结构”、“字节排序函数”等。这些API几乎是所有的网络编程中都会使用的一些&…

C库函数与系统函数的关系

转载于:https://www.cnblogs.com/lr1402585172/p/10464933.html

Unix网络编程(六)高级I/O技术之复用技术 select

转载&#xff1a;http://blog.csdn.net/michael_kong_nju/article/details/44887411 I/O复用技术 本文将讨论网络编程中的高级I/O复用技术&#xff0c;将从下面几个方面进行展开&#xff1a; a. 什么是复用技术呢&#xff1f; b. 什么情况下需要使用复用技术呢&#xff1f; c. …

open、read、write、文件类型

open&#xff0c;打开一个文件、创建一个文件或判断一个文件是否存在。 头文件&#xff1a;<sys/types.h> <sys/stat.h> <fcntl.h> 重载函数有&#xff1a;int open(const char *pathname, int flags) int open(const char *pathname, int flags, mode_t m…

用模板写单链表 尹成

转载&#xff1a;http://blog.csdn.net/itcastcpp/article/details/39081953 为了加深对模板的理解&#xff0c;我们今天一起用模板写一个单链表&#xff0c;希望通过这个例子&#xff0c;能够帮助大家加深对模板的体会&#xff0c;具体如下&#xff1a; SList.hpp内容&#xf…

lseek、stat、access、chmod、strtol、truncate、unlink

lseek&#xff0c;可实现计算文件长度&#xff0c;以及文件扩展。 int ret lseek(fd, 0, SEEK_END); //文件长度printf("file lendth %d\n", ret); int ret lseek(fd, 2000, SEEK_END); //文件拓展2000个byte 在文件末尾偏移2000printf("return va…

inode浅谈

索引节点inode&#xff1a;保存的其实是实际的数据的一些信息&#xff0c;这些信息称为“元数据”(也就是对文件属性的描述)。例如&#xff1a;文件大小&#xff0c;设备标识符&#xff0c;用户标识符&#xff0c;用户组标识符&#xff0c;文件模式&#xff0c;扩展属性&#x…

Openssl-MD5

http://blog.csdn.net/sunspider107/article/details/7395904 MD5是最常用的一个信息摘要算法&#xff0c;虽然现在慢慢被SHA1算法替代&#xff0c;但还是应用广泛。 MD5的计算结果是16个字节。 int MD5_Init(MD5_CTX *c); 初始化MD5 Context参数&#xff1b; c: MD5 context; …

opendir、readdir以及使用

opendir&#xff0c;打开一个目录。 函数原型&#xff1a;DIR *opendir(const char *name) DIR *fopendir(int fd) DIR是一个结构指针&#xff0c;是一个内部结构&#xff0c;保存所打开的目录信息。函数出错返回NULL readdir&#xff0c;读目录 ,<dirent.h> 函数原型&am…

Linux下C语言使用openssl库进行MD5校验

http://blog.csdn.net/cassie_huang/article/details/53212933 作者&#xff1a;无脑仔的小明 出处&#xff1a;http://www.cnblogs.com/wunaozai/ 我们以一个字符串为例&#xff0c;新建一个文件filename.txt&#xff0c;在文件内写入hello &#xff0c;然后在Linux下可以使…

dup、dup2、fcntl

dup、dup2&#xff0c;复制文件描述符 int dup(int oldfd);  //返回文件描述表中没有被占用的最小可用的描述符&#xff0c;新旧描述符作用相同 int dup2(int oldfd, int newfd);  //如果new已经被打开&#xff0c;先关闭再拷贝就会指向同一个文件&#xff0c;如果old和new…

进程

创建子进程&#xff1a;fork调用&#xff0c; 一次fork调用返回两个值&#xff0c;1、返回子进程的pid&#xff08;非负整数&#xff09; 2、返回0 父进程的fork返回子进程的id&#xff0c;子进程的fork返回0&#xff08;表示执行成功&#xff09; 创建单个子进程&#xff1a; …

Ubuntu在vmware虚拟机无法上网的解决方法

http://blog.csdn.net/xueyushenzhou/article/details/50460183 在vmware中安装Ubuntu之后&#xff0c;我们希望基本的功能如上网、传输文件等功能都是可用的&#xff0c;但是经常遇到不能上网的情况。使用笔记本时&#xff0c;我们经常希望能通过无线网卡上网&#xff0c;但是…

exec函数族

fork创建子进程后执行的是和父进程相同的程序&#xff08;但有可能执行不同的代码分支&#xff09;&#xff0c;子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时&#xff0c;该进程的用户空间代码和数据完全被新程序替换&#xff0c;从新程序的启动例…