稀疏图的表示妙法——邻接表【用数组+结构体实现】
0.总结
Get to the points firstly, the article comes from LawsonAbs!
- 用数组来表示出图【可用结构体+数组搞一个邻接表 或者是用 纯数组 的方法】
- 这种方法被很多
OIer
与Acmer
称作链式前向星 - 适合稀疏图的存储
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++;
}
需要注意的是:更新值的顺序有讲究。