图:邻接表和邻接矩阵的模板代码
邻接表和邻接矩阵的模板代码
一、邻接矩阵:
一般适用于有向图,有n个结点就构建一个动态数组vector<int>linjie[n],本质是一个二维数组。构建过程:如果a连着b c d,就:linjie[a].push_back(b),linjie[a].push_back(c),linjie[a].push_back(c).那么linjie[a].size()就是a连的结点的个数linjie[a][i]就是a连的第i个结点。
vector<int>linjie[n];//n个结点 int a,b; //存储 for(int i=1;i<=m;++i)//m条边 { cin>>a>>b; linjie[a].push_back(b); } //遍历第x个结点邻接的结点 int x, for(int i=0;i<linjie[x].size();++i) { cout<<linjie[x][i];//就是邻接的结点 }
二、邻接表
一般用于无向图,从任意一个点开始dfs都可以遍历到整个图所有的点,一共有n个结点,n-1个边,此时我们需要构建head[n]、nex[2*maxn]、to[2*maxn]、index.如果边有权值还需要构建val[2*maxn]数组。他的本质就是把每条边都作为一组邻接关系,用index来表示第几组。我们认为每条边都是存在方向的,比如a--b 那个a->b b->a 可以认为是双向边。head[a]记录的就是以a为根,连接别的结点的最后一条边的index ,to[i]就代表第i组被连接的结点,nex[i]存储的就是第i组数据时,他的头结点是a 那么nex[i]存的就是此时的head[a],这样就可以根据这一组边 找到上一组同时以a为起点的边了 注意此时要更新head[a]为刚存的这一组,这样最后遍历某一个结点a的邻接关系时,就可以从head[a]开始找到组数一直递推到第一组,遍历所有邻接关系。
int head[maxn], to[2 * maxn], nex[2 * maxn], val[2 * maxn], index;//邻接表 //邻接函数 void add(int a, int b, int c) { index++; val[index] = c; to[index] = b; nex[index] = head[a]; head[a] = index; } //输入邻接关系 for (int i = 1; i < n; ++i) { cin >> a >> b >> c; add(a, b, c); add(b, a, c);//注意是双向的 } memset(head, -1, sizeof(head));//初始化邻接表的head数组为-1,这样遍历的时候就有边界返回条件 //遍历邻接关系 for (int i = head[u]; i != -1; i = nex[i]) { int j = to[i]; }