欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数组模拟邻接表

程序员文章站 2022-05-30 08:36:32
...

邻接表
数组模拟邻接表
可以用链表实现,也可以用数组实现

const int N = 100000;
struct e {
	int to, w, next;
} edge[N];
int head[N], cnt = 0;

void add(int u, int v, int w) {
	edge[cnt].to = v;
	edge[cnt].w  = w;
	edge[cnt].next = head[u];
	head[u] = cnt++;
}
memset(head, -1, sizeof(head));

head数组可以理解成表头它记录了它第一条边的的坐标。
结构体数组edge[i]数组是第 i 条边,记录了它连接的下一个节点(to),边的权值(w),它的下一条边(next)。
列组数据
u v w ———— u是起点,v是终点,w是边权值
1 2 3
1 3 4
1 5 6
2 4 7
3 5 9
edge[0].to=2; edge[0]. w=3; edge[0].next=-1; head[1]=0
edge[1].to=3; edge[1]. w=4; edge[1].next= 1; head[1]=1
edge[2].to=5; edge[2]. w=6; edge[2].next= 2; head[1]=2
edge[3].to=4; edge[3]. w=7; edge[3].next=-1; head[2]=3
edge[4].to=5; edge[4]. w=9; edge[4].next=-1; head[3]=4
每个节点最后一条边的next都是-1;
数组模拟邻接表
dfs

void dfs(int u) {
	vis[u] = true;
	for(int i=head[u]; i>=0; i = edge[i].next) {
		int son = edge[i].to;
		if(!vis[son])	dfs(son);
	}
}

bfs

int queue[N];
int vis[N];
void bfs(int u) {
	int start = 0, end = 0;
	queue[0] = u;
	vis[u] = true;
	while(start <= end) {
		int parent = queue[start];
		start++;
		for(int i=head[parent]; i>=0; i = edge[i].next) {
			int son = edge[i].to;
			if(!vis[son]) {
				++end;
				queue[end] = son;
				vis[son] = true;
			}
		}
	}
}

dfs 和 bfs 都只是模板可以改改的

相关标签: