【数组模拟邻接表】

前言

在做图论算法题的过程中,总会遇到用数组来模拟邻接表进而表示图。之前一直没弄明白在用数组模拟邻接表相关的细节。如今明白了,记录一下。帮助不理解的小伙伴。

一、所用变量

const int N = 1010;  //表示点的个数
const int M = 10100; //表示边的条数
int h[N]; //h[i]表示以当前点i为起点所相连的第一条边的序号
int e[2*M];   //e[i]表示第i条边所对应的终点
int ne[2*M];  //ne[i]表示第i条边的下一条边的序号。
int idx;      //表示边的序号,从0开始

二、初始化数组

邻接表在遍历或者图在遍历的时候,需要指定终止条件,因此将h数组里面的值初始化为-1

//可以采用memset函数初始化
for(int i = 0;i

三、边的添加

void add(int a, int b)
{    // a表示起点,b表示终点
	 e[idx] = b;     //第idx条边的终点
	 ne[idx] = h[a]; //第idx条边的下一条边的idx,如果当前结点没有出边就是-1
	 h[a] = idx++;   // 当前点有新的出边,更新为最后一次添加边的序号。
}

四、邻接表的遍历

void tableTravel()
{
	for(int k = 0 ;k

五、图的遍历

void dfs(int u)
{
	st[u] = true;
	cout<

六、完整demo代码

#include
using namespace std;
const int N = 1010;
const int M = 10010;
int h[N];
int ne[M*2];
int e[M*2];
int idx;
bool st[N];
void add(int a,int b)
{
	e[idx] = b;
	ne[idx] = h[a];
	h[a] = idx++;
}
void dfs(int u)
{
	st[u] = true;
	cout<

最后

如有不当尽请指正,有疑问,可在评论区提问。

你可能感兴趣的:(c++,算法,图论,深度优先)