【图(上)】小白专场:如何建立图
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相同
【图(上)】小白专场:如何建立图相关推荐
- android多文件上传错误,微信多图上传解决android多图上传失败问题
微信提供了文件上传的方法wx.uploadFile来上传我们的图片 wx.chooseImage({ success: function(res) { var tempFilePaths = res. ...
- matlab在一张图上画两条折线图,excel2013怎么在一张曲线图上绘制多条曲线?
office软件每年的更新速度很快,虽然更新后的版本肯定能够实现更新前的功能,但是由于版式方面的改进,使得使用者初次使用时不是特别得心应手.下面重点讲述一下,如何利用excel2013在同一张图中做多 ...
- 微信小程序多图上传/朋友圈传图效果【附完整源码】
效果图 部分源代码 js文件: var uploadPicture = require('../Frameworks/common.js') //获取应用实例 const app = getApp() ...
- php 原生多图上传,php 原生多图文件上传
public function actionAl(){ $file = $_FILES['file'];//得到传输的数据 $name = $file['name'];//获取值 if(is_arra ...
- php户型图识别,户型图上的那些标注都是啥?看不懂难怪被坑
相信大家对于户型图并不陌生,我们在现实生活中,不管是买房子还是装修房子,户型图都是必须要看的.我们要学会看户型图,才能在看房的过程中避免商家的忽悠,从户型图上可以了解到很多的信息,不至于我们买了房子再 ...
- 地图上雷达探测到的物体实时映射到雷达图上
思路:通过运算公式求出在雷达图上的位置在用定位的方式展示出来 计算公式: X=雷达图半径+雷达探测到的距离*cos雷达探测到的角度*雷达范围半径大小和雷达图半径大小的比例 Y=雷达图半径-雷达探测到的 ...
- Matlab批量拟合曲线并绘制在一张图上
文章目录 简单的拟合 批量拟合并呈现在一张图上 最终结果与完整代码 简单的拟合 在命令行输入 cftool 可以启动工具箱 1.在"选择数据"中导入数据 2.选择拟合方法(matl ...
- 图神经网络简介,什么是图神经网络,GNN
目录 什么是图? 二.怎么把一些内容表示成图 2.1 怎么把图片表示成图 2.2 将一句话表示成图 2.3 其他信息转换成图的例子 2.3.1 分子结构表示成图 2.3.2 社会人物关系表示成图 2. ...
- 箱式图 分组_小白学R(三):重复测量数据的箱式图上的p值如何改大小呢?
上一期分享了重复数据箱式图的使用条件和数据格式小白学R(二):重复测量数据/连续数据的箱式图(ggplot包)(1),今天就奉上箱式图的代码和以及如何改箱式图上的p值大小. 画箱式图 1.1 先看数据 ...
- ICML2020 | 基于贝叶斯元学习在关系图上进行小样本关系抽取
今天给大家介绍来自加拿大蒙特利尔大学Mila人工智能研究所唐建教授课题组在ICML2020上发表的一篇关于关系抽取的文章.作者利用全局关系图来研究不同句子之间的新关系,并提出了一种新的贝叶斯元学习方法 ...
最新文章
- 数据结构(十)栈的作用--大数的加法运算
- 可以在手机里运行的Detectron2来了:Facebook官方出品,支持端到端模型训练、量化和部署...
- Java高级面试题!java构造方法的作用和特点
- C++ 第三方常用网络库
- 1-7:学习shell之透过shell看世界
- python-基础回顾
- Java 文件操作-RandomAccessFile
- 求解线性方程组(SVD,QR,Gauss,LU)
- IDEA 日常小技巧
- java dbaResult_资深DBA经验总结 Oracle数据库最佳实践 PDF 下载
- select函数的使用
- 如何用计算机对cad的草图,cad文件导入草图大师的方法步骤
- 计算机文件夹添加密码,电脑如何给文件夹设置密码
- 计算机网络双绞线实验报告
- 吉林大学前卫南区计算机宿舍,睡过双一流学生宿舍后,把宿舍照片分享给你们,看看你们想去的学校宿舍长啥样!...
- python forward函数_Python——函数
- 如何使用云桌面进行开发?
- 华为交换IP POOL地址池使用情况查询
- 麻木的踏实,但丧失了真实
- 【机器学习】经典的机器学习200道面试题(附参考答案)