图的存储和深度优先遍历以及广度优先遍历(C++)

图的存储和深度优先遍历以及广度优先遍历(C++)

:由顶点的有穷非空集合和顶点之间边的集合组成
无向图的邻接点是指其顶点相连的边数
有向图中邻接点是指其顶点的出度

顶点的度:在无向图中,顶点 v 的度是指依附于该顶点的边数,通常记为TD (v)【即顶点相邻的边数】
顶点的入度:在有向图中,顶点 v 的入度是指以该顶点为弧头的弧的数目,记为ID (v);【即指向它的线的个数】
顶点的出度:在有向图中,顶点 v 的出度是指以该顶点为弧尾的弧的数目,记为OD (v);【即由它出发的线的个数】

连通图:在无向图中,如果任意两个顶点都是连通的,则称该无向图是连通图
连通分量:非连通图的极大连通子图【连通分量是对无向图的一种划分】
强连通顶点:在有向图中,如果从顶点vi到顶点vj和从顶点vj到顶点vi均有路径,则称顶点vi和vj是强连通的。
强连通图在有向图中,如果任意两个顶点都是强连通的,则称该有向图是强连通图
强连通分量:非强连通图的极大连通子图

无向完全图:无向图中,任意两个顶点之间都存在边
n 个顶点的无向完全图有多少条边?【n×(n-1)/2 】
有向完全图:有向图中,任意两个顶点之间都存在方向相反的两条弧
n 个顶点的有向完全图有多少条弧?【n×(n-1) 】

图的存储——邻接矩阵
vertex[MaxSize]; //一维数组存储顶点
edge[MaxSize][MaxSize]; //二维数组存储边

图的遍历:从图中某一顶点出发访问图中所有顶,并且每个结点仅被访问一次 。分为深度优先遍历和广度优先遍历

深度优先遍历的基本思想是:【深度优先遍历是一个递归的过程】
(1)访问顶点 v
(2)从 v 的未被访问的邻接点中选取一个顶点 w,从 w 出发进行深度优先遍历
(3)重复上述两步,直至访问所有和 v 有路径相通的顶点

算法:DFTraverse
输入:顶点的编号 v
输出:无
1. 访问顶点 v ; 修改标志visited[v] = 1;
2. w =顶点 v 的第一个邻接点;
3. while (w 存在)
3.1 if (w 未被访问) 从顶点 w 出发递归执行该算法;
3.2 w = 顶点 v 的下一个邻接点;

void MGraph :: DFTraverse(int v)
{
cout << vertex[v]<<" "; visited[v] = 1;
for (int j = 0; j < vertexNum; j++)
if (edge[v][j] == 1 && visited[j] == 0)
DFTraverse( j );
}

广度优先遍历的基本思想是:
⑴ 访问顶点 v
⑵ 依次访问 v 的各个未被访问的邻接点 v1 , v2 , …, vk
⑶ 分别从 v1 , v2 , …, vk 出发依次访问它们未被访问的邻接点,直至访问所有与顶点 v 有路径相通的顶点

算法:BFTraverse
输入:顶点的编号 v
输出:无
1. 队列 Q 初始化;
2. 访问顶点 v ; 修改标志visited [v] = 1; 顶点 v 入队列 Q;
3. while (队列 Q 非空)
3.1 v = 队列 Q 的队头元素出队;
3.2 w = 顶点 v 的第一个邻接点;
3.3 while (w 存在)
3.3.1 如果 w 未被访问,则
访问顶点 w ; 修改标志visited[w] = 1; 顶点 w 入队列 Q;
3.3.2 w = 顶点 v 的下一个邻接点;

void MGraph :: BFTraverse(int v)
{
int w, j, Q[MaxSize]; //采用顺序队列
int front = -1, rear = -1; //初始化队列
cout << vertex[v]<<" “;
visited[v] = 1; Q[++rear] = v; //被访问顶点入队
while (front != rear) //当队列非空时
{
w = Q[++front]; //将队头元素出队并送到v中
for (j = 0; j < vertexNum; j++)
if (edge[w][j] == 1 && visited[j] == 0 ) {cout << vertex[j]<<” "; visited[j] = 1; Q[++rear] = j; }
}
}

综合案例

#include<iostream>
using  namespace std;
 
const int MaxSize = 10;        
int visited[MaxSize] = {
   0};  
         
template <typename DataType>
class MGraph{
   
public
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值