/*** C++: 邻接矩阵图** @author judyge* @date 2014/04/19*/#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;#define MAX 100
class MatrixDG {private:char mVexs[MAX];    // 顶点集合int mVexNum;             // 顶点数int mEdgNum;             // 边数int mMatrix[MAX][MAX];   // 邻接矩阵public:// 创建图(自己输入数据)MatrixDG();// 创建图(用已提供的矩阵)MatrixDG(char vexs[], int vlen, char edges[][2], int elen);~MatrixDG();// 深度优先搜索遍历图void DFS();// 广度优先搜索(类似于树的层次遍历)void BFS();// 打印矩阵队列图void print();private:// 读取一个输入字符char readChar();// 返回ch在mMatrix矩阵中的位置int getPosition(char ch);// 返回顶点v的第一个邻接顶点的索引,失败则返回-1int firstVertex(int v);// 返回顶点v相对于w的下一个邻接顶点的索引,失败则返回-1int nextVertex(int v, int w);// 深度优先搜索遍历图的递归实现void DFS(int i, int *visited);};/* * 创建图(自己输入数据)*/
MatrixDG::MatrixDG()
{char c1, c2;int i, p1, p2;// 输入"顶点数"和"边数"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] = readChar();}// 初始化"边"for (i = 0; i < mEdgNum; i++){// 读取边的起始顶点和结束顶点cout << "edge(" << i << "): ";c1 = readChar();c2 = readChar();p1 = getPosition(c1);p2 = getPosition(c2);if (p1==-1 || p2==-1){cout << "input error: invalid edge!" << endl;return ;}mMatrix[p1][p2] = 1;}
}/** 创建图(用已提供的矩阵)** 参数说明:*     vexs  -- 顶点数组*     vlen  -- 顶点数组的长度*     edges -- 边数组*     elen  -- 边数组的长度*/
MatrixDG::MatrixDG(char vexs[], int vlen, char edges[][2], int elen)
{int i, p1, p2;// 初始化"顶点数"和"边数"mVexNum = vlen;mEdgNum = elen;// 初始化"顶点"for (i = 0; i < mVexNum; i++)mVexs[i] = vexs[i];// 初始化"边"for (i = 0; i < mEdgNum; i++){// 读取边的起始顶点和结束顶点p1 = getPosition(edges[i][0]);p2 = getPosition(edges[i][1]);mMatrix[p1][p2] = 1;}
}/* * 析构函数*/
MatrixDG::~MatrixDG()
{
}/** 返回ch在mMatrix矩阵中的位置*/
int MatrixDG::getPosition(char ch)
{int i;for(i=0; i<mVexNum; i++)if(mVexs[i]==ch)return i;return -1;
}/** 读取一个输入字符*/
char MatrixDG::readChar()
{char ch;do {cin >> ch;} while(!((ch>='a'&&ch<='z') || (ch>='A'&&ch<='Z')));return ch;
}/** 返回顶点v的第一个邻接顶点的索引,失败则返回-1*/
int MatrixDG::firstVertex(int v)
{int i;if (v<0 || v>(mVexNum-1))return -1;for (i = 0; i < mVexNum; i++)if (mMatrix[v][i] == 1)return i;return -1;
}/** 返回顶点v相对于w的下一个邻接顶点的索引,失败则返回-1*/
int MatrixDG::nextVertex(int v, int w)
{int i;if (v<0 || v>(mVexNum-1) || w<0 || w>(mVexNum-1))return -1;for (i = w + 1; i < mVexNum; i++)if (mMatrix[v][i] == 1)return i;return -1;
}/** 深度优先搜索遍历图的递归实现*/
void MatrixDG::DFS(int i, int *visited)
{int w;visited[i] = 1;cout << mVexs[i] << " ";// 遍历该顶点的所有邻接顶点。若是没有访问过,那么继续往下走for (w = firstVertex(i); w >= 0; w = nextVertex(i, w)){if (!visited[w])DFS(w, visited);}}/** 深度优先搜索遍历图*/
void MatrixDG::DFS()
{int i;int visited[MAX];       // 顶点访问标记// 初始化所有顶点都没有被访问for (i = 0; i < mVexNum; i++)visited[i] = 0;cout << "DFS: ";for (i = 0; i < mVexNum; i++){//printf("\n== LOOP(%d)\n", i);if (!visited[i])DFS(i, visited);}cout << endl;
}/** 广度优先搜索(类似于树的层次遍历)*/
void MatrixDG::BFS()
{int head = 0;int rear = 0;int queue[MAX];     // 辅组队列int visited[MAX];   // 顶点访问标记int i, j, k;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] << " ";queue[rear++] = i;  // 入队列}while (head != rear) {j = queue[head++];  // 出队列for (k = firstVertex(j); k >= 0; k = nextVertex(j, k)) //k是为访问的邻接顶点{if (!visited[k]){visited[k] = 1;cout << mVexs[k] << " ";queue[rear++] = k;}}}}cout << endl;
}/** 打印矩阵队列图*/
void MatrixDG::print()
{int i,j;cout << "Martix Graph:" << endl;for (i = 0; i < mVexNum; i++){for (j = 0; j < mVexNum; j++)cout << mMatrix[i][j] << " ";cout << endl;}
}int main()
{char vexs[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};char edges[][2] = {{'A', 'B'}, {'B', 'C'}, {'B', 'E'}, {'B', 'F'}, {'C', 'E'}, {'D', 'C'}, {'E', 'B'}, {'E', 'D'}, {'F', 'G'}}; int vlen = sizeof(vexs)/sizeof(vexs[0]);int elen = sizeof(edges)/sizeof(edges[0]);MatrixDG* pG;// 自定义"图"(输入矩阵队列)//pG = new MatrixDG();// 采用已有的"图"pG = new MatrixDG(vexs, vlen, edges, elen);pG->print();   // 打印图pG->DFS();     // 深度优先遍历pG->BFS();     // 广度优先遍历return 0;
}

ACM模板--邻接矩阵 有向图 搜索算法相关推荐

  1. ACM模板--邻接矩阵 无向图 搜索算法

    /*** C++: 邻接矩阵表示的"无向图(Matrix Undirected Graph)"** @author judyge* @date 2014/04/19*/#inclu ...

  2. ACM模板--邻接矩阵 有向图

    /*** C++: 邻接矩阵图** @author judyge* @date 2014/04/19*/#include <iomanip> #include <iostream&g ...

  3. ACM模板--邻接矩阵 无向图 Prim Kruskal Dijkstra

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

  4. ACM模板--邻接矩阵 无向图

    /*** C++: 邻接矩阵表示的"无向图(List Undirected Graph)"** @author skywang* @date 2014/04/19*/#includ ...

  5. ACM模板--链接表 有向图

    /*** C++: 邻接表图** @author judyge* @date 2014/04/19*/#include <iomanip> #include <iostream> ...

  6. 我的所有优质博客全部开源啦(我自己原创的《ACM模板》《算法全家桶》《算法竞赛中的初等数论》 PDF免费下载)

    你好呀ヾ(≧▽≦*)o 我是繁凡さん 这两年来我写了很多长篇文章,主要涉及数据结构,算法,程序设计竞赛,数学,计算几何等方面的内容: <数据结构>C语言版(清华严蔚敏考研版) 全书知识梳理 ...

  7. 线性求逆元模板_ZXBlog/ACM模板(C++).md at bb6f2522054d5370df79222461293721e8edede2 · cw1027/ZXBlog · GitHub...

    ACM模板(C++) 1.大数 加法,乘法模板 //题目链接 : http://poj.org/problem?id=2506 //题目大意 : 就是问你用2*1,1*2,2*2的砖拼成2*n的长方形 ...

  8. ACM模板(满注释模板!)

    转自:https://fanfansann.blog.csdn.net/article/details/105493218 目录 F o r e w o r d ForewordForeword T ...

  9. 邻接矩阵有向图的介绍

    邻接矩阵有向图的介绍 邻接矩阵有向图是指通过邻接矩阵表示的有向图. 上面的图G2包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"<A,B>,< ...

最新文章

  1. 纠错工具之 - Proovread
  2. Debian、Ubuntu安装源配置文件说明
  3. 从零开始html css,HTML/CSS从零开始-常用属性(三)
  4. 搞懂正则表达式之进阶篇
  5. 提取验证码到winform上webbroswer和axwebbroswer
  6. Javascrip之匿名函数
  7. 地表上最强编程语言——C语言
  8. 最后一周,如何高效率的备考软考信息安全工程师?
  9. Oracle 自定义函数、存储过程
  10. 探讨【IGE】的源代码【二】。
  11. MySQL【部署 04】8.0.25离线部署(下载+安装+配置)Failed dependencies 问题处理及8.0配置参数说明
  12. 凭证 金蝶_5分钟学会金蝶软件凭证录入!
  13. Readme文件写法
  14. html页边距为负值,css中的padding属性可以为负值吗?css中padding属性的详解
  15. draw.io软件添加常用字体
  16. Android模拟器加速——让你的android模拟器和真机速度一样
  17. h5 HTML5 浏览器 录制视频
  18. 亚像元定位 硬分类 软分类
  19. Google组织架构不学传统大公司
  20. Mysql—数据模型

热门文章

  1. 【Android 插件化】VAHunt 引入 | VAHunt 原理 | VAHunt 识别插件化引擎
  2. 【Netty】mmap 和 sendFile 零拷贝原理
  3. 【Kotlin】扩展属性 ( 扩展变量属性 | 扩展常量属性 | 注意事项 | 本质分析 )
  4. GIL(全局解释器锁)与互斥锁
  5. Perl的输出:print、say和printf、sprintf
  6. bzoj 1061: [Noi2008]志愿者招募【最小费用最大流】
  7. pgjdbc源码分析
  8. 添加FB登陆时,需要curl扩展
  9. [Win32::Console]Perl终端版生命游戏
  10. 使用Nginx的proxy_cache缓存功能取代Squid[原创]