图是表示“多对多的关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;}

插入操作示意图:

数据结构 图的初始化相关推荐

  1. 数据结构--图(Graph)详解(四)

    数据结构–图(Graph)详解(四) 文章目录 数据结构--图(Graph)详解(四) 一.图中几个NB的算法 1.普里姆算法(Prim算法)求最小生成树 2.克鲁斯卡尔算法(Kruskal算法)求最 ...

  2. 数据结构--图(Graph)详解(三)

    数据结构–图(Graph)详解(三) 文章目录 数据结构--图(Graph)详解(三) 一.深度优先生成树和广度优先生成树 1.铺垫 2.非连通图的生成森林 3.深度优先生成森林 4.广度优先生成森林 ...

  3. 数据结构--图(Graph)详解(二)

    数据结构–图(Graph)详解(二) 文章目录 数据结构--图(Graph)详解(二) 一.图的存储结构 1.图的顺序存储法 2.图的邻接表存储法 3.图的十字链表存储法 4.图的邻接多重表存储法 二 ...

  4. 数据结构--图(Graph)详解(一)

    数据结构–图(Graph)详解(一) 文章目录 数据结构--图(Graph)详解(一) 一.图的基本概念 1.图的分类 2.弧头和弧尾 3.入度和出度 4.(V1,V2) 和 < V1,V2 & ...

  5. 【数据结构(C语言)】数据结构-图

    图 文章目录 图 一.基本概念 1.图的定义 2.约定符号 3.分类 4.子图 5.路 6.其他术语 7.ADT 二.存储结构 1.邻接矩阵(数组) 2.邻接表 三.基本算法 1.遍历 2.求无向图的 ...

  6. 数据结构——图(存储结构)

    数据结构--图 图的定义和基本术语 图的类型定义 图的存储结构 数组(邻接矩阵表示法) 网(即有权图)的邻接矩阵表示法 邻接表 邻接表表示法(链式) 图的邻接表存储表示 采用邻接表表示法创建无向网 邻 ...

  7. 数据结构——图的邻接表存储

    数据结构--图的邻接表存储 功能实现: (1)图的邻接矩阵的储存 (2)深度优先遍历 (3).广度优先遍历 (4)求结点的度 (5)判断图是否连通 (6)求最小生成树 参考代码 #include &l ...

  8. 数据结构-图内容总结

    数据结构-图内容总结 一.图的两种常用存储结构 二.图的两种遍历方式 三.最短路径的两种算法 四.最小生成树的两种算法 五.拓扑排序 六.关键路径 一.图的两种常用存储结构 邻接矩阵和邻接表存储的都是 ...

  9. 数据结构—图(Part Ⅱ)—最小生成树 最短路径

    目录 最小生成树 普里姆(Prim)算法 算法实现 运行结果 程序分析 克鲁斯卡尔(Kruskal)算法 算法实现 运行结果 程序分析 最短路径 广度优先搜索(BFS)算法 算法实现 运行结果 程序分 ...

最新文章

  1. java中的随机生成算法_Java生成随机时间的简单随机算法
  2. mysql 如何查看constraint定义的的所有约束_MySQL:如何查看表上的所有约束?
  3. Bootstrap 输入组
  4. php ajax成功失败,php – 让$.ajax失败
  5. 解决webserver tcp连接大量CLOSE_WAIT 问题
  6. Gitlab添加SSH密钥的解决办法
  7. SQL查询语句,怎样查询重复数据
  8. 只需一个设置命令隐藏 MacBook Pro 浏海
  9. h5 如何录音保存上传_H5录音及保存到后台recorder.js实现
  10. 模式窗口(Window.ShowModalDialogs)中提交不弹出新窗口
  11. springboot基于BS结构的企业人事管理系统的设计与实现毕业设计源码121727
  12. AD硬件电路学习笔记(一)常见的管脚名字以及FPGA、Lora等常见的物联网组网
  13. (附源码)计算机毕业设计ssm红色景点自驾游网站管理系统
  14. R语言基于方差分析ANOVA检验模型拟合度(Fit Test)实战:检验同一数据集简单模型和复杂模型的拟合度差异
  15. 清除电脑bios密码
  16. Linux 压缩、解压、打包操作
  17. 在Windows 7镜像中整合“SP2”补丁
  18. ic618画版图2.0
  19. 文科生学python_论文科生学习Python的收获
  20. 浅谈非极大值抑制和IOU

热门文章

  1. 存储引擎的概念及作用,玩转MySQL
  2. shmget()函数:
  3. c语言自定义浮点函数,C语言float
  4. 开发一个简单的智能合约
  5. 打开wps,提示: 运行时错误 429 activeX部件不能创建对象
  6. AWS EC2/S3命令记录
  7. Untiy3D使用HighlightingSystem插件实现鼠标移动到物体物体高亮效果
  8. Java多线程 理发店小测试
  9. PART1 WebPack
  10. java 时间片_Java 实现--时间片轮转 RR 进程调度算法