稀疏图的表示妙法——邻接表【用数组+结构体实现】

本文介绍了一种适用于稀疏图的高效存储方式——邻接表法,通过结构体与数组结合,实现图的灵活存储。适用于竞赛编程中的链式前向星结构,详解了使用结构体和纯数组两种实现方式。

稀疏图的表示妙法——邻接表【用数组+结构体实现】


0.总结

Get to the points firstly, the article comes from LawsonAbs!
  • 用数组来表示出图【可用结构体+数组搞一个邻接表 或者是用 纯数组 的方法】
  • 这种方法被很多OIerAcmer称作链式前向星
  • 适合稀疏图的存储

1.使用结构体+数组表示

1.1 主要思想

  • 用结构体存储边的信息
  • 用数组head[maxN]存储各个顶点的第一条边的序号
typedef struct {
	int next,to,wei;//同一顶点的下一条边的序号【是边的序号】;边的指向; 边的权重[本例中没有用到] 
}Edge; 
Edge edge[maxN];//存储边的信息
int head[maxN];//存储顶点的第一条边的序号 
int num = 0;//边数
 
//添加边
void add(int a,int b){
	edge[num].next = head[a]; //指向当前这个顶点的第一条边
	edge[num].to = b;		
	head[a] = num;//更新节点a最新的边[即使其成为当前这个顶点的第一条边] => 有点儿前插法的感觉
	num++;	 
}

1.2 完整代码

#include<iostream>
using namespace std;
const int maxN = 10005;//边数 
const int maxV = 10005;//顶点的信息 
typedef struct {
	int next,to,wei;//下一条边的序号;边的指向; 边的权重[本例中没有用到] 
}Edge; 
Edge edge[maxN];//存储边的信息
int head[maxN];//存储顶点的第一条边的序号 
int num = 0;//边数
 
//添加边的过程 
void add(int a,int b){
	edge[num].next = head[a];
	edge[num].to = b;		
	head[a] = num;//a节点最新的边,指向第num条边
	num++;	 
}

int main(){
	int n;
	fill(head,head+maxV,-1);//初始化 
	cin >> n;
	int start,nei;//顶点编号;顶点权;邻边序号 
	for(int i = 1;i<=n;i++){
		cin >> start >> nei;		
		add(start,nei);
	}
		
	//遍历输出这张图 
	for(int i  =1;i<=n;i++){		
		cout << i << "->";
		for( int j = head[i]; j!=-1; j=edge[j].next ){
			cout << edge[j].to << "->";		
		}cout<<"-1\n";
	} 
} 

1.3 测试用例

用例说明:这里的7代表的就是7条有向边。接下来是7条有向边的具体信息。

7
2 1
3 2
4 1
5 2
6 2
7 3
5 6

update on 20200619

  • 01.添加纯数组的邻接表写法
  • 02.容易出现的问题

2.使用纯数组表示

有如下几个全局变量:

int head[maxN],nex[maxN],to[maxN];//
int tot = 1;

其中各个的含义同1中【使用结构体+数组表示】很类似。

head[a] 表示节点a的指向的第一条辺
nex[tot] 表示第tot条辺指向的下一条辺
to[tot]表示第tot条辺的终点
tot表示辺的个数

//建数组邻接表
void add(int a,int b ){
    nex[tot] = head[a];//更新上一条辺的序号
    head[a] = tot; //结点a的第一条辺是head[a]
    to[tot] = b;//第tot条辺的终点
    tot++;
}

需要注意的是:更新值的顺序有讲究。

### 回答1: 好的,以下是用 C 语言结构体定义邻接矩阵和邻接表表示图的结构体邻接矩阵: ```c #define MAX_VERTEX_NUM 100 // 最大顶点数 // 邻接矩阵表示图的结构体 typedef struct { char vertex[MAX_VERTEX_NUM]; // 顶点数组 int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵 int vertex_num; // 顶点数 int edge_num; // 边数 } MGraph; ``` 邻接表: ```c #define MAX_VERTEX_NUM 100 // 最大顶点数 // 邻接表表示图的结构体 typedef struct ArcNode { // 边结点 int adjvex; // 邻接点下标 struct ArcNode *next; // 指向下一个边结点的指针 } ArcNode; typedef struct VNode { // 顶点结点 char data; // 顶点信息 ArcNode *firstarc; // 指向第一个边结点的指针 } VNode, AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList vertices; // 邻接表头结点数组 int vertex_num; // 顶点数 int edge_num; // 边数 } ALGraph; ``` 希望能够解答您的问题! ### 回答2: 用C语言结构体定义邻接矩阵和邻接表表示图的结构体如下: 1. 邻接矩阵表示图的结构体: ```c #define MAX_VERTICES 100 // 图中最大顶点数 typedef struct { int numVertices; // 图中的顶点数 int adjMatrix[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵,用来表示顶点之间的关系 } GraphAM; // 邻接矩阵表示图的结构体 ``` 2. 邻接表表示图的结构体: ```c #define MAX_VERTICES 100 // 图中最大顶点数 // 链表节点结构体 typedef struct Node { int vertex; // 目标顶点的索引 struct Node* next; // 指向下一个节点的指针 } Node; // 邻接表节点结构体 typedef struct { Node* head; // 指向链表头节点的指针 } AdjList[MAX_VERTICES]; typedef struct { int numVertices; // 图中的顶点数 AdjList adjList; // 邻接表数组 } GraphAL; // 邻接表表示图的结构体 ``` 邻接矩阵表示图是一个二维数组,其中`adjMatrix[i][j]`存储了顶点i和j之间是否存在边的信息。 邻接表表示图使用链表来存储每个顶点的邻居节点,数组`adjList[]`中的每个元素对应一个顶点,其中`head`指针指向链表的头节点。每个链表节点中的`vertex`存储了目标顶点的索引,而`next`指针则指向下一个节点。 ### 回答3: 用C语言结构体定义邻接矩阵和邻接表表示图的结构体,可以如下所示: 1. 邻接矩阵表示图的结构体: ```c #define MAX_VERTEX_NUM 100 // 图中最大顶点数 typedef struct { int vertexNum; // 顶点数 int edgeNum; // 边数 int adjacencyMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵数组 } AdjMatrixGraph; ``` 在上述结构体中,`vertexNum`用于记录图的顶点数,`edgeNum`用于记录图的边数,`adjacencyMatrix`是一个二维数组,用于存储图的邻接矩阵。 2. 邻接表表示图的结构体: ```c #define MAX_VERTEX_NUM 100 // 图中最大顶点数 typedef struct ArcNode { int adjvex; // 邻接点下标 struct ArcNode* nextarc; // 指向下一个邻接点的指针 // 这里可以添加其他数据域,如边的权重等 } ArcNode; typedef struct VNode { int data; // 顶点数据 ArcNode* firstarc; // 指向第一个邻接点的指针 } VNode, AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList vertices; // 邻接表数组 int vertexNum; // 顶点数 int edgeNum; // 边数 } AdjListGraph; ``` 在上述结构体中,`VNode`表示图的顶点,其中`data`用于存储顶点的数据,`firstarc`指向该顶点的第一个邻接点。`ArcNode`表示邻接点,其中`adjvex`存储邻接点的下标,`nextarc`指向下一个邻接点的指针。`AdjListGraph`是邻接表表示图的主要结构体,其中`vertices`是一个数组,存储所有的顶点,`vertexNum`记录顶点数,`edgeNum`记录边数。 以上就是用C语言结构体定义邻接矩阵和邻接表表示图的结构体的示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

说文科技

看书人不妨赏个酒钱?

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

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

打赏作者

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

抵扣说明:

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

余额充值