数据结构 图的初始化
图是表示“多对多的关a系”
包含:
一组顶点, 通常用V表示顶点集合
一组边:通常用E表示边的集合
边是顶点对:(v,w)表示从V指向W(无向边)
有向边<v,w> 表示从v指向w的边---> 单行线
不考虑重边和回路
图的类型:
无向图:没有方向的图
有向图:拥有方向的图,两条点之间的边带有箭头
网络图:边带权重的图
如何在程序中实现一个图?
(1)邻接矩阵->G[N][N]
实现程序如下:
#include<iostream>
#include<algorithm>
#define N 10
using namespace std;
int G[N][N];int main() {for (int i = 0; i < N; ++i)for (int j = 0; j < N; ++j) {G[i][j] = 0;if (i == 0 && (j == 1 || j == 3))G[i][j] = 1;if (i == 1 && (j == 0 || j == 3 || j == 2 || j == 5))G[i][j] = 1;if (i == 2 && (j == 1 || j == 4 || j == 5))G[i][j] = 1;if (i == 3 && (j == 0 || j == 1 || j == 6 || j == 7))G[i][j] = 1;if (i == 4 && (j == 2 || j == 5 || j == 9))G[i][j] = 1;if (i == 5 && (j == 1 || j == 2 || j == 4 || j == 6 || j == 8 || j == 9))G[i][j] = 1;if (i == 6 && (j == 3 || j == 5 || j == 7 || j == 8))G[i][j] = 1;if (i == 7 && (j == 3 || j == 6))G[i][j] = 1;if (i == 8 && (j == 5 || j == 6 || j == 9))G[i][j] = 1;if (i == 9 && (j == 4 || j == 5 || j == 8))G[i][j] = 1;}for (int i = 0; i < N; ++i) {for (int j = 0; j < N; ++j) {cout << G[i][j] << " ";}cout << endl;}system("PAUSE");return 0;
}
观察可得: 斜对角矩阵全为0 意思是一个点到自己的距离
以斜对角为轴 该图是对称的
所以空间上有浪费
度的概念: 入度指向这条边的边的条数
出度:从一个度出发 指向别的边
邻接表的表示方法:
邻接表:G[N]为指针数组,对应矩阵每行一个列表
只存非0元素
图的建立:
邻接矩阵表示法
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#define MAXSIZE 10
using namespace std;
typedef int weightType;class eEdge {friend class GraphicOperation;
private: int V1; //顶点1 int V2; //顶点2weightType weight; //一条边的权重};class Graphic { //图框架的定义friend class GraphicOperation;
private:int Nv; //顶点的个数int Ne; //边的个数weightType G[MAXSIZE][MAXSIZE]; //用来存放顶点关系的二维数组
};class GraphicOperation {
private:Graphic* ObjectGrahpic;
public:GraphicOperation() {ObjectGrahpic = new Graphic(); //创建对象}void CreateGraphic(int vertexNum); //创建一个图 初始化:只有顶点没有边void InsertGraphic(eEdge* E); //插入一条边void BuildGraphic(); //图的建立
};void GraphicOperation::CreateGraphic(int vertexNum) {ObjectGrahpic->Nv = vertexNum;ObjectGrahpic->Ne = 0;for (int V = 0; V < ObjectGrahpic->Nv; ++V)for (int E = 0; E < ObjectGrahpic->Nv; ++E)ObjectGrahpic->G[V][E] = 0; //图的初始化工作}void GraphicOperation::InsertGraphic(eEdge* E) { //在图中插入一条边ObjectGrahpic->G[E->V1][E->V2] = E->weight; //无向图只需插入一条边ObjectGrahpic->G[E->V2][E->V1] = E->weight; //有向图需插入两次
}void GraphicOperation::BuildGraphic() {//首先读入顶点int vertexNum; cin >> vertexNum;CreateGraphic(vertexNum);//然后读入边int edgeNums;cin >> edgeNums;ObjectGrahpic->Ne = edgeNums; //边的条数//之后创建边并插入if (ObjectGrahpic->Ne != 0) {eEdge* E = new eEdge(); for (int i = 0; i < ObjectGrahpic->Ne; ++i) {cin >> E->V1 >> E->V2 >> E->weight;InsertGraphic(E); //把边插入即可}}
}
邻接表的使用:
首先定义顶点
class Vnode {friend class VnodeAdjList;
private:adjVnode* FirstEdge; //指向下一条边dataType data; //存放的数据
};
然后定义协调顶点和边的模块
class adjVnode {friend class adjVNode; //调节节点
public:verTex Adj; //下一个顶点的信息weightType Weight; //边的权重adjVnode* next; //指向下一个节点};
存储边的信息
class eEdge {friend class GraphicOperation;
private:int V1; //顶点1 int V2; //顶点2weightType weight; //一条边的权重};
图的框架
//存放图的数据
class Graphic { friend class GraphicOperation;
public:int Nv; //顶点的个数int Ne; //边的条数Vnode G[MAXSIZE]; //用来存放顶点};
图的创建操作(和邻接矩阵相似)
void GraphicOperation::CreateGraphic(int VertexNum) {verTex V, W;objGrahpic->Nv = VertexNum; //先初始化顶点objGrahpic->Ne = 0; //后将边初始化为0for (int V = 0; V < objGrahpic->Nv; ++V) {objGrahpic->G[V].FirstEdge = NULL; //把每一个顶点的初始边设置为0}
}
边的插入操作
//边的插入
void GraphicOperation::InsertEdge(eEdge* edge) {adjVnode* newNode = new adjVnode(); //创建一个新的节点newNode->Weight = edge->weight;newNode->Adj = edge->V2; //指向的下一个顶点//节点的插入newNode->next = objGrahpic->G[edge->V1].FirstEdge;objGrahpic->G[edge->V1].FirstEdge = newNode;}
插入操作示意图:
数据结构 图的初始化相关推荐
- 数据结构--图(Graph)详解(四)
数据结构–图(Graph)详解(四) 文章目录 数据结构--图(Graph)详解(四) 一.图中几个NB的算法 1.普里姆算法(Prim算法)求最小生成树 2.克鲁斯卡尔算法(Kruskal算法)求最 ...
- 数据结构--图(Graph)详解(三)
数据结构–图(Graph)详解(三) 文章目录 数据结构--图(Graph)详解(三) 一.深度优先生成树和广度优先生成树 1.铺垫 2.非连通图的生成森林 3.深度优先生成森林 4.广度优先生成森林 ...
- 数据结构--图(Graph)详解(二)
数据结构–图(Graph)详解(二) 文章目录 数据结构--图(Graph)详解(二) 一.图的存储结构 1.图的顺序存储法 2.图的邻接表存储法 3.图的十字链表存储法 4.图的邻接多重表存储法 二 ...
- 数据结构--图(Graph)详解(一)
数据结构–图(Graph)详解(一) 文章目录 数据结构--图(Graph)详解(一) 一.图的基本概念 1.图的分类 2.弧头和弧尾 3.入度和出度 4.(V1,V2) 和 < V1,V2 & ...
- 【数据结构(C语言)】数据结构-图
图 文章目录 图 一.基本概念 1.图的定义 2.约定符号 3.分类 4.子图 5.路 6.其他术语 7.ADT 二.存储结构 1.邻接矩阵(数组) 2.邻接表 三.基本算法 1.遍历 2.求无向图的 ...
- 数据结构——图(存储结构)
数据结构--图 图的定义和基本术语 图的类型定义 图的存储结构 数组(邻接矩阵表示法) 网(即有权图)的邻接矩阵表示法 邻接表 邻接表表示法(链式) 图的邻接表存储表示 采用邻接表表示法创建无向网 邻 ...
- 数据结构——图的邻接表存储
数据结构--图的邻接表存储 功能实现: (1)图的邻接矩阵的储存 (2)深度优先遍历 (3).广度优先遍历 (4)求结点的度 (5)判断图是否连通 (6)求最小生成树 参考代码 #include &l ...
- 数据结构-图内容总结
数据结构-图内容总结 一.图的两种常用存储结构 二.图的两种遍历方式 三.最短路径的两种算法 四.最小生成树的两种算法 五.拓扑排序 六.关键路径 一.图的两种常用存储结构 邻接矩阵和邻接表存储的都是 ...
- 数据结构—图(Part Ⅱ)—最小生成树 最短路径
目录 最小生成树 普里姆(Prim)算法 算法实现 运行结果 程序分析 克鲁斯卡尔(Kruskal)算法 算法实现 运行结果 程序分析 最短路径 广度优先搜索(BFS)算法 算法实现 运行结果 程序分 ...
最新文章
- java中的随机生成算法_Java生成随机时间的简单随机算法
- mysql 如何查看constraint定义的的所有约束_MySQL:如何查看表上的所有约束?
- Bootstrap 输入组
- php ajax成功失败,php – 让$.ajax失败
- 解决webserver tcp连接大量CLOSE_WAIT 问题
- Gitlab添加SSH密钥的解决办法
- SQL查询语句,怎样查询重复数据
- 只需一个设置命令隐藏 MacBook Pro 浏海
- h5 如何录音保存上传_H5录音及保存到后台recorder.js实现
- 模式窗口(Window.ShowModalDialogs)中提交不弹出新窗口
- springboot基于BS结构的企业人事管理系统的设计与实现毕业设计源码121727
- AD硬件电路学习笔记(一)常见的管脚名字以及FPGA、Lora等常见的物联网组网
- (附源码)计算机毕业设计ssm红色景点自驾游网站管理系统
- R语言基于方差分析ANOVA检验模型拟合度(Fit Test)实战:检验同一数据集简单模型和复杂模型的拟合度差异
- 清除电脑bios密码
- Linux 压缩、解压、打包操作
- 在Windows 7镜像中整合“SP2”补丁
- ic618画版图2.0
- 文科生学python_论文科生学习Python的收获
- 浅谈非极大值抑制和IOU