图论·树或图的DFS和BFS搜索

图论的存储

  • 邻接表
  • 邻接矩阵(一般不用)

邻接表

结构体数组实现

  • 缺点:如果使用结构体的话,node结构体初始化很慢。
cpp 复制代码
// common one
vector<list<int>>g;
// another type
typedef struct node{
	int val;
	int dist;// 如果需要节点到某点的距离的话
}
vector<list<node>>g;
  • 插入操作
cpp 复制代码
q.push_back(item)

纯数组实现(y总版本)

  • 邻接表定义:
  • h代表链表头指针,指向v,nxt数组中的每一个节点
  • v代表某一个边终点节点 的具体值,nxt代表指向的边。注意这两个数组其实都是代表边 ,可能会出现1->3,2->3,3号节点对应v和nxt中不同的位置的情况!
  • v和nxt的大小等于边数
  • len代表总共有多少边。
cpp 复制代码
int h[100009], v[100009], nxt[100009], len = 0;
  • 插入操作
cpp 复制代码
void insert(int x,int y) {
	len++;
	v[len] = y;
	nxt[len] = h[x];
	h[x] = len;
	d[y]++;
}
  • 容易出错的操作:搜索时我们假定得到的是节点编号 ,但是我们nxt和h指向的是该节点的实际存储位置。
cpp 复制代码
for (int i = h[cur]; i != -1; i = nxt[i]) {
	int node = v[i];
	d[node]--;
	if (!d[node]) {
		q.push(node);
	}
}

DFS

例题

cpp 复制代码
int n,ans=INT_MAX;
int h[100009], v[200009], nxt[200009], len = 0, visited[100009];
// 返回当前节点的连通图数量
int dfs(int cur) {
	visited[cur] = 1;
	int res = 0, sum = 0;
	for (int i = h[cur]; i != -1; i = nxt[i]) {
		int node = v[i];
		if (!visited[node]) {
			int tmp = dfs(node);
			res = max(res, tmp);
			sum += tmp;
		}
	}
	res = max(res, n - sum - 1);
	ans = min(ans, res);
	// 根据动态规划的思想考虑当前节点的连通图节点数量。
	return sum + 1;
}
void insert(int x, int y) {
	len++;
	v[len] = y;
	nxt[len] = h[x];
	h[x] = len;
}
void solve() {
	cin >> n;
	memset(h, -1, sizeof h);
	for (int i = 1; i <= n - 1; i++) {
		int a, b;
		cin >> a >> b;
		insert(a, b);
		insert(b, a);
	}
	dfs(1);
	cout << ans;
}

BFS

例题

cpp 复制代码
void bfs() {
	q.push(1);
	visited[1] = 1;
	while (q.size()) {
		int cur = q.front();
		if (cur == n) {
			cout << dist[cur];
			return;
		}
		q.pop();
		for (int i = h[cur]; i != -1; i = nxt[i]) {
			int node = v[i];
			if (!visited[node]) {
				visited[node] = 1;
				dist[node] = dist[cur] + 1;
				q.push(node);
			}
		}
	}
	cout << -1;
}
相关推荐
xiaoye-duck15 小时前
《算法题讲解指南:递归,搜索与回溯算法--综合练习》--14.找出所有子集的异或总和再求和,15.全排列Ⅱ,16.电话号码的字母组合,17.括号生成
c++·算法·深度优先·回溯
mmz120719 小时前
深度优先搜索DFS(c++)
c++·算法·深度优先
汀、人工智能21 小时前
[特殊字符] 第9课:三数之和
数据结构·算法·数据库架构·图论·bfs·三数之和
汀、人工智能21 小时前
[特殊字符] 第10课:接雨水
数据结构·算法·数据库架构·图论·bfs·接雨水
漂流瓶jz1 天前
UVA-10384 推门游戏 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·深度优先·题解·aoapc·算法竞赛入门经典·uva
汀、人工智能2 天前
16 - 高级特性
数据结构·算法·数据库架构·图论·16 - 高级特性
汀、人工智能2 天前
[特殊字符] 第3课:最长连续序列
数据结构·算法·数据库架构·图论·bfs·最长连续序列
汀、人工智能2 天前
[特殊字符] 第6课:四数相加II
数据结构·算法·数据库架构·图论·bfs·四数相加ii
汀、人工智能2 天前
10 - 元组tuple:不可变序列
数据结构·算法·数据库架构·图论·不可变序列
汀、人工智能2 天前
08 - 集合set:去重和快速查找
数据结构·算法·数据库架构·图论·去重和快速查找