图的 广度优先搜索

深度递归与非递归搜索

/*** C++: 邻接表表示的"无向图(List Undirected Graph)"** @author judyge* @date 2014/04/19*/#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;#define MAX 100
// 邻接表
class ListUDG
{private: // 内部类// 邻接表中表对应的链表的顶点class ENode{public:int ivex;           // 该边所指向的顶点的位置ENode *nextEdge;    // 指向下一条弧的指针};// 邻接表中表的顶点class VNode{public:char data;          // 顶点信息ENode *firstEdge;   // 指向第一条依附该顶点的弧};private: // 私有成员int mVexNum;             // 图的顶点的数目int mEdgNum;             // 图的边的数目VNode mVexs[MAX];public:// 创建邻接表对应的图(自己输入)ListUDG();// 创建邻接表对应的图(用已提供的数据)ListUDG(char vexs[], int vlen, char edges[][2], int elen);~ListUDG();// 深度优先搜索遍历图void DFS();// 广度优先搜索(类似于树的层次遍历)void BFS();// 打印邻接表图void print();private:// 读取一个输入字符char readChar();// 返回ch的位置int getPosition(char ch);// 深度优先搜索遍历图的递归实现void DFS(int i, int *visited);// 将node节点链接到list的最后void linkLast(ENode *list, ENode *node);
};/** 创建邻接表对应的图(自己输入)*/
ListUDG::ListUDG()
{char c1, c2;int v, e;int i, p1, p2;ENode *node1, *node2;// 输入"顶点数"和"边数"cout << "input vertex number: ";cin >> mVexNum;cout << "input edge number: ";cin >> mEdgNum;if ( mVexNum < 1 || mEdgNum < 1 || (mEdgNum > (mVexNum * (mVexNum-1)))){cout << "input error: invalid parameters!" << endl;return ;}// 初始化"邻接表"的顶点for(i=0; i<mVexNum; i++){cout << "vertex(" << i << "): ";mVexs[i].data = readChar();mVexs[i].firstEdge = NULL;}// 初始化"邻接表"的边for(i=0; i<mEdgNum; i++){// 读取边的起始顶点和结束顶点cout << "edge(" << i << "): ";c1 = readChar();c2 = readChar();p1 = getPosition(c1);p2 = getPosition(c2);// 初始化node1node1 = new ENode();node1->ivex = p2;// 将node1链接到"p1所在链表的末尾"if(mVexs[p1].firstEdge == NULL)mVexs[p1].firstEdge = node1;elselinkLast(mVexs[p1].firstEdge, node1);// 初始化node2node2 = new ENode();node2->ivex = p1;// 将node2链接到"p2所在链表的末尾"if(mVexs[p2].firstEdge == NULL)mVexs[p2].firstEdge = node2;elselinkLast(mVexs[p2].firstEdge, node2);}
}/** 创建邻接表对应的图(用已提供的数据)*/
ListUDG::ListUDG(char vexs[], int vlen, char edges[][2], int elen)
{char c1, c2;int i, p1, p2;ENode *node1, *node2;// 初始化"顶点数"和"边数"mVexNum = vlen;mEdgNum = elen;// 初始化"邻接表"的顶点for(i=0; i<mVexNum; i++){mVexs[i].data = vexs[i];mVexs[i].firstEdge = NULL;}// 初始化"邻接表"的边for(i=0; i<mEdgNum; i++){// 读取边的起始顶点和结束顶点c1 = edges[i][0];c2 = edges[i][1];p1 = getPosition(c1);p2 = getPosition(c2);// 初始化node1node1 = new ENode();node1->ivex = p2;// 将node1链接到"p1所在链表的末尾"if(mVexs[p1].firstEdge == NULL)mVexs[p1].firstEdge = node1;elselinkLast(mVexs[p1].firstEdge, node1);// 初始化node2node2 = new ENode();node2->ivex = p1;// 将node2链接到"p2所在链表的末尾"if(mVexs[p2].firstEdge == NULL)mVexs[p2].firstEdge = node2;elselinkLast(mVexs[p2].firstEdge, node2);}
}/* * 析构函数*/
ListUDG::~ListUDG()
{
}/** 将node节点链接到list的最后*/
void ListUDG::linkLast(ENode *list, ENode *node)
{ENode *p = list;while(p->nextEdge)p = p->nextEdge;p->nextEdge = node;
}/** 返回ch的位置*/
int ListUDG::getPosition(char ch)
{int i;for(i=0; i<mVexNum; i++)if(mVexs[i].data==ch)return i;return -1;
}/** 读取一个输入字符*/
char ListUDG::readChar()
{char ch;do {cin >> ch;} while(!((ch>='a'&&ch<='z') || (ch>='A'&&ch<='Z')));return ch;
}/** 深度优先搜索遍历图的递归实现*/
void ListUDG::DFS(int i, int *visited)
{ENode *node;visited[i] = 1;cout << mVexs[i].data << " ";node = mVexs[i].firstEdge;while (node != NULL){if (!visited[node->ivex])DFS(node->ivex, visited);node = node->nextEdge;}
}/** 深度优先搜索遍历图*/
void ListUDG::DFS()
{int i;int visited[MAX];       // 顶点访问标记// 初始化所有顶点都没有被访问for (i = 0; i < mVexNum; i++)visited[i] = 0;cout << "DFS: ";for (i = 0; i < mVexNum; i++){if (!visited[i])DFS(i, visited);}cout << endl;
}/** 广度优先搜索(类似于树的层次遍历)*/
void ListUDG::BFS()
{int head = 0;int rear = 0;int queue[MAX];     // 辅组队列int visited[MAX];   // 顶点访问标记int i, j, k;ENode *node;for (i = 0; i < mVexNum; i++)visited[i] = 0;cout << "BFS: ";for (i = 0; i < mVexNum; i++){if (!visited[i]){visited[i] = 1;cout << mVexs[i].data << " ";queue[rear++] = i;  // 入队列}while (head != rear) {j = queue[head++];  // 出队列node = mVexs[j].firstEdge;while (node != NULL){k = node->ivex;if (!visited[k]){visited[k] = 1;cout << mVexs[k].data << " ";queue[rear++] = k;}node = node->nextEdge;}}}cout << endl;
}/** 打印邻接表图*/
void ListUDG::print()
{int i,j;ENode *node;cout << "List Graph:" << endl;for (i = 0; i < mVexNum; i++){cout << i << "(" << mVexs[i].data << "): ";node = mVexs[i].firstEdge;while (node != NULL){cout << node->ivex << "(" << mVexs[node->ivex].data << ") ";node = node->nextEdge;}cout << endl;}
}int main()
{char vexs[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};char edges[][2] = {{'A', 'C'}, {'A', 'D'}, {'A', 'F'}, {'B', 'C'}, {'C', 'D'}, {'E', 'G'}, {'F', 'G'}};int vlen = sizeof(vexs)/sizeof(vexs[0]);int elen = sizeof(edges)/sizeof(edges[0]);ListUDG* pG;// 自定义"图"(输入矩阵队列)//pG = new ListUDG();// 采用已有的"图"pG = new ListUDG(vexs, vlen, edges, elen);pG->print();   // 打印图pG->DFS();     // 深度优先遍历pG->BFS();     // 广度优先遍历return 0;
}

ACM 模板--邻接表 无向图 搜索算法相关推荐

  1. ACM模板--邻接表 无向图 Prim Kruskal Dijkstra

    /*** C++: Dijkstra算法获取最短路径(邻接表)** @author judyge* @date 2014/04/24*/#include <iomanip> #includ ...

  2. ACM 模板--邻接表 有向图 搜索算法

    邻接表图的广度优先搜索 深度递归与非递归搜索 /*** C++: 邻接表图** @author judyge* @date 2014/04/19*/#include <iomanip> # ...

  3. ACM 模板--邻接表 有向图 拓扑排序

    /*** C++: 无回路有向图(Directed Acyclic Graph)的拓扑排序* 该DAG图是通过邻接表实现的. ** @author judyge* @date 2014/04/22*/ ...

  4. java邻接表无向图的创建_邻接表无向图(三) 之Java详解

    前面分别介绍了邻接表无向图的C和C++实现,本文通过Java实现邻接表无向图. 目录 邻接表无向图的介绍 邻接表无向图是指通过邻接表表示的无向图. 上面的图G1包含了"A,B,C,D,E,F ...

  5. java:邻接表无向图的链表实现法

    首先画出邻接表图: 分析: 观察右边的邻接表可以发现,A~E每个顶点都有自己的编号,每个顶点又跟其他数组相关联.我们可以把所有的顶点看做一个数组,而与每个顶点相关联的其他顶点又是一个数组,那么整个邻接 ...

  6. 有向图,无向图的邻接矩阵和邻接表模板

    图 图的定义 有向图 概念 模板 邻接矩阵 邻接表 无向图 概念 模板 邻接矩阵 邻接表 简单图 完全图 图的定义 图 GGG 由顶点集 VVV 和边集 EEE 组成,记为 G=(V,E)G=(V,E ...

  7. 数据结构之图的创建(邻接表)

    数据结构之图的基本概念中了解了图的基本概念,接下来对图的代码实现进行详解. 邻接无向图 1. 邻接表无向图介绍 邻接表无向图是指通过邻接表表示的无向图. 上面的图G1包含了"A,B,C,D, ...

  8. 图的两种存储形式(邻接矩阵、邻接表)

    图可以使用两种存储结构,分别是邻接矩阵和邻接表. 注意:一个图所对应的邻接矩阵唯一,所对应的邻接表不唯一 一.邻接矩阵 邻接矩阵以矩阵的形式存储图所有顶点间的关系.邻接矩阵具有以下特点: 1.邻接矩阵 ...

  9. 图的链式存储结构解析(邻接表、逆邻接表、十字链表、邻接多重表)

    图的矩阵表示法比较消耗空间,需要花费$ n 2 n^2 n2$个单元存储边(弧).在边数较少的情况下比较浪费.我们这里来讨论图的链式存储结构. 图的链式结构主要有四类:邻接表.逆邻接表.十字链表.邻接 ...

最新文章

  1. Oracle的基本操作(一:子查询与常用函数)
  2. 2!=5 or 0在python中是否正确-不吹不擂,你想要的Python面试都在这里了【315+道题】...
  3. POJ 1860 Currency Exchange
  4. OpenCV 开闭运算
  5. 洞悉linux下的Netfilteriptables
  6. 【Qt】2D绘图之涂鸦板
  7. Java程序员:不要因未知而让云成本大涨
  8. JAVA8后接口的新特性
  9. TortoiseGit 分支管理策略
  10. Educational Codeforces Round 20 B. Distances to Zero
  11. 新一代互联网巨头老板,最大方谁抠门?
  12. 利用管道实现进程间同步
  13. APNs Push Notification教程一
  14. python单因素方差分析_Python数据科学:方差分析
  15. ARM_kafka搭建
  16. Whole Word Masking
  17. UUID和UUID_SHORT
  18. project.json
  19. 极大似然估计量(θ)
  20. rfid android开发板,iTOP-6818开发板-Android4.4系统下RFID射频模块测试例程

热门文章

  1. 【Android 插件化】VAHunt 检测插件化引擎的具体细节
  2. 【EventBus】事件通信框架 ( 取消注册 | 获取事件参数类型 | 根据事件类型获取订阅者 | 移除相关订阅者 )
  3. 【计算机网络】传输层 : TCP 拥塞控制 ( 慢开始 | 拥塞避免 | 快重传 | 快恢复 )
  4. 【Android 电量优化】电量优化 ( 耗电量测试 | Battery Historian 简介 | apt 源更新 | Docker 安装 | Battery Historian 安装 )
  5. 第五节、实现接口 [转贴]
  6. BZOJ.4160.[NEERC2009]Exclusive Access 2(状压DP Dilworth定理)
  7. top命令详析及排查问题使用演示
  8. HDOJ/HDU 1556 Color the ball(树状数组)
  9. 机器人动力学建模实例:二连杆机械臂
  10. 前端JS: 通过代码-看函数作用域this对象