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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


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++;
}

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