1、用邻接矩阵表示图

typedef struct GNode *PtrToGNode;
struct GNode
{int Nv;        //顶点数int Ne;        //边数DataType Data[MaxVertexNum]; //存顶点的数据
};
typedef PtrToGNode MGraph;  //以邻接矩阵存储的图类型

MGraph初始化

  • 初始化一个有VertexNum个顶点但没有边的图
typedef int Vertex; //用顶点下标表示顶点,为整型
MGraph CreateGraph(int VertexNum)
{Vertex V, W;MGraph Graph;Graph = (MGraph)malloc(sizeof(struct GNode));Graph->Nv = VertexNum;Graph->Ne = 0;/* 注意:这里默认顶点编号从0开始,到(Graph->Nv - 1) */for (V = 0; V<Graph->Nv; V++)for (W = 0; W<Graph->Nv; W++)Graph->G[V][W] = 0; //或INFINITYreturn Graph;
}

向MGraph中插入边

typedef struct ENode *PtrToENode;
struct ENode
{Vertex V1, V2;     //有向边<V1, V2>WeightType Weight; //权重
};
typedef PtrToENode Edge;void InsertEdge(MGraph Graph, Edge E)
{Graph->G[E->V1][E->V2] = E->Weight;//插入边<V1, V2>Graph->G[E->V2][E->V1] = E->Weight;//若是无向图,还要插入边<V2, V1>
}

完整地建立一个MGraph

  • 输入格式
    Nv Ne
    V1 V2 Weight
    ……
MGraph BuildGraph()
{MGraph Graph;Edge E;Vertex V;int Nv, i;scanf("%d", &Nv);Graph = CreateGraph(Nv);scanf("%d", &(Graph->Ne));if (Graph->Ne != 0){E = (Edge)malloc(sizeof(struct ENode));for (i = 0; i<Graph->Ne; i++){scanf("%d %d %d",&E->V1, &E->V2, &E->Weight);InsertEdge(Graph, E);}}//如果顶点有数据的话,读入数据for (V = 0; V<Graph->Nv; V++)scanf(" %c", &(Graph->Data[V]));return Graph;
}

简单方法实现用邻接矩阵表示图的建立

int G[MAXN][MAXN], Nv, Ne;
void BuildGraph()
{int i, j, v1, v2, w;scanf("%d", &Nv);//CreateGraphfor (i = 0; i<Nv; i++)for (j = 0; j<Nv; j++)G[i][j] = 0; //或INFINITYscanf("%d", &Ne);for (i = 0; i<Ne; i++){scanf("%d %d %d", &v1, &v2, &w);//InsertEdgeG[v1][v2] = w;G[v2][v1] = w;}
}

此种方法的缺点,这种建立方法只适用于用邻接矩阵表示图,若换一种表示方法,就不适用了,不推荐

2、用邻接表表示图

  • 邻接表:G[N]为指针数组,对应矩阵每行一个链表,只存非0元素
typedef struct Vnode
{PtrToAdjVNode FirstEdge;DataType Data; //存顶点的数据
} AdjList[MaxVertexNum];
//AdjList是邻接表类型,
//有几个顶点就有几个链表,每一个链表开始于一个结点和一个指针typedef struct GNode *PtrToGNode;
struct GNode
{int Nv;    //顶点数int Ne;    //边数AdjList G;  //邻接表
};
typedef PtrToGNode LGraph;
//以邻接表方式存储的图类型,包括有顶点,边和邻接表typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode {Vertex AdjV;   //邻接点下标WeightType Weight; //边权重PtrToAdjVNode Next;
};

LGraph初始化

  • 初始化一个有VertexNum个顶点但没有边的图
typedef int Vertex; //用顶点下标表示顶点,为整型
LGraph CreateGraph(int VertexNum)
{Vertex V, W;LGraph Graph;Graph = (LGraph)malloc(sizeof(struct GNode));Graph->Nv = VertexNum;Graph->Ne = 0;//注意:这里默认顶点编号从0开始,到(Graph->Nv - 1)for (V = 0; V<Graph->Nv; V++)Graph->G[V].FirstEdge = NULL;return Graph;
}

向LGraph中插入边

void InsertEdge(LGraph Graph, Edge E)
{PtrToAdjVNode NewNode;/************* 插入边<V1, V2> ************///为V2建立新的邻接点NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));NewNode->AdjV = E->V2;NewNode->Weight = E->Weight;//将V2插入V1的表头NewNode->Next = Graph->G[E->V1].FirstEdge;Graph->G[E->V1].FirstEdge = NewNode;/****** 若是无向图,还要插入边<V2, V1> ******///为V1建立新的邻接点NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));NewNode->AdjV = E->V1;NewNode->Weight = E->Weight;//将V1插入V2的表头NewNode->Next = Graph->G[E->V2].FirstEdge;Graph->G[E->V2].FirstEdge = NewNode;
}

完整地建立一个LGraph

同完整地建立一个MGraph相同

【图(上)】小白专场:如何建立图相关推荐

  1. android多文件上传错误,微信多图上传解决android多图上传失败问题

    微信提供了文件上传的方法wx.uploadFile来上传我们的图片 wx.chooseImage({ success: function(res) { var tempFilePaths = res. ...

  2. matlab在一张图上画两条折线图,excel2013怎么在一张曲线图上绘制多条曲线?

    office软件每年的更新速度很快,虽然更新后的版本肯定能够实现更新前的功能,但是由于版式方面的改进,使得使用者初次使用时不是特别得心应手.下面重点讲述一下,如何利用excel2013在同一张图中做多 ...

  3. 微信小程序多图上传/朋友圈传图效果【附完整源码】

    效果图 部分源代码 js文件: var uploadPicture = require('../Frameworks/common.js') //获取应用实例 const app = getApp() ...

  4. php 原生多图上传,php 原生多图文件上传

    public function actionAl(){ $file = $_FILES['file'];//得到传输的数据 $name = $file['name'];//获取值 if(is_arra ...

  5. php户型图识别,户型图上的那些标注都是啥?看不懂难怪被坑

    相信大家对于户型图并不陌生,我们在现实生活中,不管是买房子还是装修房子,户型图都是必须要看的.我们要学会看户型图,才能在看房的过程中避免商家的忽悠,从户型图上可以了解到很多的信息,不至于我们买了房子再 ...

  6. 地图上雷达探测到的物体实时映射到雷达图上

    思路:通过运算公式求出在雷达图上的位置在用定位的方式展示出来 计算公式: X=雷达图半径+雷达探测到的距离*cos雷达探测到的角度*雷达范围半径大小和雷达图半径大小的比例 Y=雷达图半径-雷达探测到的 ...

  7. Matlab批量拟合曲线并绘制在一张图上

    文章目录 简单的拟合 批量拟合并呈现在一张图上 最终结果与完整代码 简单的拟合 在命令行输入 cftool 可以启动工具箱 1.在"选择数据"中导入数据 2.选择拟合方法(matl ...

  8. 图神经网络简介,什么是图神经网络,GNN

    目录 什么是图? 二.怎么把一些内容表示成图 2.1 怎么把图片表示成图 2.2 将一句话表示成图 2.3 其他信息转换成图的例子 2.3.1 分子结构表示成图 2.3.2 社会人物关系表示成图 2. ...

  9. 箱式图 分组_小白学R(三):重复测量数据的箱式图上的p值如何改大小呢?

    上一期分享了重复数据箱式图的使用条件和数据格式小白学R(二):重复测量数据/连续数据的箱式图(ggplot包)(1),今天就奉上箱式图的代码和以及如何改箱式图上的p值大小. 画箱式图 1.1 先看数据 ...

  10. ICML2020 | 基于贝叶斯元学习在关系图上进行小样本关系抽取

    今天给大家介绍来自加拿大蒙特利尔大学Mila人工智能研究所唐建教授课题组在ICML2020上发表的一篇关于关系抽取的文章.作者利用全局关系图来研究不同句子之间的新关系,并提出了一种新的贝叶斯元学习方法 ...

最新文章

  1. 数据结构(十)栈的作用--大数的加法运算
  2. 可以在手机里运行的Detectron2来了:Facebook官方出品,支持端到端模型训练、量化和部署...
  3. Java高级面试题!java构造方法的作用和特点
  4. C++ 第三方常用网络库
  5. 1-7:学习shell之透过shell看世界
  6. python-基础回顾
  7. Java 文件操作-RandomAccessFile
  8. 求解线性方程组(SVD,QR,Gauss,LU)
  9. IDEA 日常小技巧
  10. java dbaResult_资深DBA经验总结 Oracle数据库最佳实践 PDF 下载
  11. select函数的使用
  12. 如何用计算机对cad的草图,cad文件导入草图大师的方法步骤
  13. 计算机文件夹添加密码,电脑如何给文件夹设置密码
  14. 计算机网络双绞线实验报告
  15. 吉林大学前卫南区计算机宿舍,睡过双一流学生宿舍后,把宿舍照片分享给你们,看看你们想去的学校宿舍长啥样!...
  16. python forward函数_Python——函数
  17. 如何使用云桌面进行开发?
  18. 华为交换IP POOL地址池使用情况查询
  19. 麻木的踏实,但丧失了真实
  20. 【机器学习】经典的机器学习200道面试题(附参考答案)

热门文章

  1. 手机怎么修改照片kb大小?一分钟解决
  2. word和wps添加mathtype选项卡
  3. linux scandir函数,Linux的scandir函数
  4. Android Charles抓包
  5. 广州珠宝商城小程序开发
  6. 献给工程师的英文课:坚持21天,读懂英文文档
  7. Android 实现直接拒接来电
  8. JSP动态网站开发环境配置详细方法
  9. 写英文论文的一些总结
  10. 关于C语言输入输出的逗号问题(小细节)