【图论】详解链式前向星存图法+遍历法

细说链式前向星存图法

首先要明白,链式前向星的原理是利用存边来进行模拟图。

推荐左神的视频--建图、链式前向星、拓扑排序

比方说有这样一张图,我们用链式前向星来进行模拟时,可以将每一条边都进行编号,其中,红色 的数字就是对每一条边的编号蓝色 的数字表示每一个结点编号

准备三个数组head[], next[], to[]

数组名称 下标含义 值的含义
head 结点值 结点指向的初边
next 边的编号 该边指向下一条边
to 边的编号 边指向的结点值

idx:表示当前还没有分配的边编号

添加边

所以添加边的函数add()可以这样去设计:

c 复制代码
//建立一个a->b的结点->结点,->表示边
inline void add(int a, int b) {
	to[idx] = b, next[idx] = head[a], head[a] = idx++;
}
//新建一条边,编号为idx,指向结点b,然后在a结点的邻居边中增加idx边,思想类似与头插法,让这个新的边指向头边,并修改头边为新的边。

Code

c 复制代码
#include <iostream>
#include <cstring>
using namespace std;

const int N = 10001;				//最多生成N个结点,N-1个单边
int head[N], to[N], next[N], idx;

// head[]头边号 
// 点号 

// next[] 下一条边号 
// 边号

// to[] 去往的点
// 边号

// idx 
inline void add(int a, int b) {
	to[idx] = b, next[idx] = head[a], head[a] = idx++;
}

inline void dfs(int u) {
	cout << u << ' ';
	int i = head[u];		//i为u结点第一条边
	for (; i != -1; i = next[i]) {
		//每次更新为下一条边
		dfs(to[i]); 		//去到 i 边指向的结点 
	}
}

int main() {
	memset(head, -1, sizeof head);//head[i]为-1表示这个结点没有后继边
	add(1, 2);
	add(1, 5);
	add(1, 6);
	add(2, 6);
	add(5, 6);
	dfs(1);
}
相关推荐
a努力。几秒前
国家电网Java面试被问:最小生成树的Kruskal和Prim算法
java·后端·算法·postgresql·面试·linq
洛生&7 分钟前
Counting Towers
算法
Evand J15 分钟前
【MATLAB例程,附代码下载链接】基于累积概率的三维轨迹,概率计算与定位,由轨迹匹配和滤波带来高精度位置,带测试结果演示
开发语言·算法·matlab·csdn·轨迹匹配·候选轨迹·完整代码
X在敲AI代码19 分钟前
LeetCode 基础刷题D2
算法·leetcode·职场和发展
源代码•宸23 分钟前
Leetcode—1929. 数组串联&&Q1. 数组串联【简单】
经验分享·后端·算法·leetcode·go
数据大魔方33 分钟前
【期货量化实战】跨期套利策略:价差交易完整指南(TqSdk源码详解)
数据库·python·算法·github·程序员创富
weixin_4617694035 分钟前
15. 三数之和
c++·算法·leetcode·三数之和
NAGNIP37 分钟前
一文搞懂机器学习中的学习理论!
算法·面试
Evand J43 分钟前
【MATLAB代码介绍】基于累积概率的三维轨迹匹配与定位,由轨迹匹配和卡尔曼滤波形成算法,带测试结果演示
算法·matlab·滤波·定位·导航·轨迹匹配
l1t43 分钟前
NineData第三届数据库编程大赛:用一条 SQL 解数独问题我的参赛程序
数据库·人工智能·sql·算法·postgresql·oracle·数独