图——(连接万物)

本文介绍了图的概念,包括顶点、边、无向图和有向图等,以及图的存储方式如邻接矩阵和邻接表。讨论了图的遍历方法,如深度优先和广度优先,并提到了图在求解最短路径问题中的应用。
摘要由CSDN通过智能技术生成

图的定义

图是用线连接在一起的顶点或节点的集合

两个要素:顶点。每一条边连接个两个顶点,用(i,j)表示顶点为 i 和 j 的边。

简单图
1.不存在顶点到其自身的边
2.同一条边不重复出现

邻接点,依附
无向图中,对于顶点v1,v2,若存在(v1,v2),则顶点v1,v2互为邻接点,边(v1,v2)依附于顶点v1,v2。
有向图中,对于顶点v1,v2,若存在<v1,v2>,则顶点v1临街到v2,顶点v2临街自v1,边(v1,v2)依附于顶点v1,v2。

无向完全图,有向完全图
无向图中,任意两个顶点间存在边,则该图为无向完全图,有n*(n-1)/2条边。
有向图中,任意两个顶点间存在两条方向相反的狐,则该图为有向完全图,有n*(n-1)条边。

稀疏图,稠密图
根据边的数量相对而言,模糊概念

顶点的度,入度,出度
无向图中,顶点v的度是指依附于v的顶点的个数,记作TD(v)。在具有n个顶点,e条边的图中,满足公式:i=0∑n−1​TD(vi​)=2e

有向图中,顶点v的入度是以v为尾的边的个数,记作ID(v)。顶点v的出度是以v为头的边的个数,记作OD(v)。在具有n个顶点,e条边的图中,满足公式:i=0∑n−1​ID(vi​)=i=0∑n−1​OD(vi​)=e
权,网
边上带权的图叫做网或网图

路径,路径长度,回路
路径:开始点到终点的顶点序列
路径长度:路径上边得数量
回路(环):开始点与终点是同一个点的路径

简单路径,简单回路
在路径序列中,顶点不重复的路径为简单路径
除了起始点与终点,顶点不重复的回路叫做简单回路

连通图,连通分量
无向图中,任意两个顶点间都有路径的图叫连通图,否则是非连通图。连通分量为非连通图的极大连通子图否则是非连通分量。

强连通图,强连通分量
有向图中,任意两个顶点vi,v2有路径,叫做强连通图,否则为非强连通图。非强连通图的极大强联通子图为该图的强连通分量。

生成树,生成森林
生成树:一个连通图的生成树是包含该图全部顶点的极小联通子图,有向图的生成树只有一个入度为0的顶点,其余顶点入度为一。
生成森林:非连通图中,每一个连通分量都可以得到一颗生成树,这些树构成了这个非连通树的生成森林。

图的基本操作

node.h文件


#ifndef NODE_H_


#define NODE_H_

class Node
{
public:
Node(char data = 0); //节点的构造函数
char m_cData;        //节点的数据域
bool m_bIsVisited;   //标记该节点是否被访问过
};

#endif

node.cpp文件


#include "Node.h"

Node::Node(char data)
{
m_cData = data;
m_bIsVisited = false;    //默认为该节点没有被访问过
}

cmap.h文件


#ifndef CMAP_H_


#define CMAP_H_

//包含vector类模板,后面的函数breadthFirstTraverseImpl(vector<int> preVec)会用到

#include <vector>


#include "Node.h"

using namespace std;
class CMap
{
public:
CMap(int capacity);           //构造函数,创建图
~CMap();                      //析构函数,销毁图
bool addNode(Node *pNode);    //增加节点
void resetNode();             //重置节点的访问状态为未访问
   //给有向图的邻接矩阵的元素设置值
bool setValueToMatrixForDirectedGraph(int row,int col,int val = 1);  
   //给无向图的邻接矩阵的元素设置值
bool setValueToMatrixForUndirectedGraph(int row,int col,int val = 1);  

void printMartrix();          //打印邻接矩阵

void depthFirstTraverse(int nodeIndex);              //深度优先遍历
void breadthFirstTraverse(int nodeIndex);            //广度优先遍历

private:
bool getValueFromMatrix(int row,int col,int &val);   //获取邻接矩阵中元素的值
   //广度优先遍历的工具函数,用来存储某一层的元素
void breadthFirstTraverseImpl(vector<int> preVec);   

private:
int m_iCapacity;               //图的节点的容量                                
int m_iNodeCount;              //图当前的节点的数量
Node *m_pNodeArray;            //指向图中首节点的指针
int *m_pMatrix;                //指向邻接矩阵首元素的指针
};

#endif

cmap.cpp文件


#include "CMap.h"
#include <iostream>
using namespace std;
CMap::CMap(int capacity)  
{
m_iCapacity = capacity;
m_iNodeCount = 0;
m_pNodeArray = new Node[m_iCapacity];
m_pMatrix = new int[m_iCapacity*m_iCapacity];
//memset(m_pMatrix,0,m_iCapacity*m_iCapacity*sizeof(int)); 
//使用c++标准函数void *memset(void *s, int ch, size_t n)实现快速初始化
for(int i = 0;i < m_iCapacity*m_iCapacity;i++)     
{     
    m_pMatrix[i] = 0;
}
}
CMap::~CMap()
{
delete []m_pNodeArray;         //先释放节点所对应的内存
delete []m_pMatrix;            //再释放邻接矩阵所对应的内存
}
bool CMap::addNode(Node *pNode)    
{
if(pNode == 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风铃奈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值