当前位置: 首页 > ds >正文

深度优先算法学习

1: 从 1点出发到 15点
在这里插入图片描述

#include <stdio.h>#define MAX_NODES 100typedef struct {int node_id;int *nextNodes;int nextNodesSize;
} Node;// 假设我们有一个节点数组,全局保存了所有节点
Node nodes[MAX_NODES];void dfs(int node_id)
{Node *node = &nodes[node_id];printf("visited: %d\n", node_id); // 打印访问的节点for (size_t i = 0; i < node->nextNodesSize; i++) {dfs(node->nextNodes[i]);}
}int main()
{// 创建并初始化临时数组int nextNodes1[] = {20, 3};int nextNodes2[] = {5, 6};int nextNodes6[] = {9, 10, 15};// 使用这些数组初始化节点nodes[1] = (Node){1, nextNodes1, 2};nodes[20] = (Node){20, nextNodes2, 2};nodes[5] = (Node){5, NULL, 0};nodes[6] = (Node){6, nextNodes6, 3};nodes[9] = (Node){9, NULL, 0};nodes[10] = (Node){10, NULL, 0};nodes[15] = (Node){15, NULL, 0};nodes[3] = (Node){3, NULL, 0};// 执行深度优先搜索dfs(1);return 0;
}

2 : 如果有环 怎么遍历
在这里插入图片描述

#include <stdio.h>#define MAX_NODES 100typedef struct
{int node_id;int *nextNodes;int nextNodesSize;
} Node;// 假设我们有一个节点数组,全局保存了所有节点
Node nodes[MAX_NODES];int isVisited[MAX_NODES]; // 0 没访问过  1 访问过void dfs(int node_id)
{Node *node = &nodes[node_id];if (isVisited[node_id] == 1){return;}isVisited[node_id] = 1;printf("visited: %d\n", node_id); // 打印访问的节点for (size_t i = 0; i < node->nextNodesSize; i++){dfs(node->nextNodes[i]);}
}
int main()
{// 创建并初始化临时数组int nextNodes1[] = {20};int nextNodes20[] = {5, 6};int nextNodes3[] = {1};int nextNodes6[] = {9, 10, 15};int nextNodes15[] = {3};// 使用这些数组初始化节点nodes[1] = (Node){1, nextNodes1, 1};nodes[20] = (Node){20, nextNodes20, 2};nodes[5] = (Node){5, NULL, 0};nodes[6] = (Node){6, nextNodes6, 3};nodes[9] = (Node){9, NULL, 0};nodes[10] = (Node){10, NULL, 0};nodes[15] = (Node){15, nextNodes15, 1};nodes[3] = (Node){3, nextNodes3, 1};// 执行深度优先搜索dfs(1);return 0;
}

3: 是否出现了环
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/bfb76d1d5950403fa208c81eef3525ff.png在这里插入图片描述

#include <stdio.h>
#define MAX_NODES 100typedef struct
{int node_id;int *nextNodes;int nextNodesSize;
} Node;// 假设我们有一个节点数组,全局保存了所有节点
Node nodes[MAX_NODES];int isVisited[MAX_NODES]; // 0 没访问过  1 访问中  2 访问完成void dfs(int node_id)
{Node *node = &nodes[node_id];if (isVisited[node_id] == 1){printf("\n id: %d cycle \n", node_id);return;}if (isVisited[node_id] == 2){return; // 已访问完成,无需重复}isVisited[node_id] = 1;printf("visited: %d\n", node_id);for (size_t i = 0; i < node->nextNodesSize; i++){dfs(node->nextNodes[i]);}isVisited[node_id] = 2;
}int main()
{// 创建并初始化临时数组int nextNodes1[] = {20};int nextNodes20[] = {5, 6};int nextNodes3[] = {1};int nextNodes6[] = {9, 10, 15};int nextNodes15[] = {3};// 使用这些数组初始化节点nodes[1] = (Node){1, nextNodes1, 1};nodes[20] = (Node){20, nextNodes20, 2};nodes[5] = (Node){5, NULL, 0};nodes[6] = (Node){6, nextNodes6, 3};nodes[9] = (Node){9, NULL, 0};nodes[10] = (Node){10, NULL, 0};nodes[15] = (Node){15, nextNodes15, 1};nodes[3] = (Node){3, nextNodes3, 1};// 执行深度优先搜索dfs(1);return 0;
}

4:期望输出环上的结点
在这里插入图片描述

#include <stdio.h>#define MAX_NODES 100typedef struct
{int node_id;int *nextNodes;int nextNodesSize;
} Node;// 假设我们有一个节点数组,全局保存了所有节点
Node nodes[MAX_NODES];int isVisited[MAX_NODES]; // 0 没访问过  1 访问中  2 访问完成int stack[MAX_NODES];
int head=0;void showstack(){printf("\n");for (size_t i = 0; i < head; i++){printf(" %d ",stack[i]);}printf("\n");
}void dfs(int node_id)
{Node *node = &nodes[node_id];if (isVisited[node_id] == 1){showstack();printf("cycle");return;}isVisited[node_id] = 1;printf("visited: %d\n", node_id); // 打印访问的节点stack[head]=node_id;head++;for (size_t i = 0; i < node->nextNodesSize; i++){dfs(node->nextNodes[i]);}isVisited[node_id] = 2;head--;
}int main()
{// 创建并初始化临时数组int nextNodes1[] = {20};int nextNodes20[] = {5, 6};int nextNodes3[] = {1};int nextNodes6[] = {9, 10, 15};int nextNodes15[] = {3};// 使用这些数组初始化节点nodes[1] = (Node){1, nextNodes1, 1};nodes[20] = (Node){20, nextNodes20, 2};nodes[5] = (Node){5, NULL, 0};nodes[6] = (Node){6, nextNodes6, 3};nodes[9] = (Node){9, NULL, 0};nodes[10] = (Node){10, NULL, 0};nodes[15] = (Node){15, nextNodes15, 1};nodes[3] = (Node){3, nextNodes3, 1};// 执行深度优先搜索dfs(1);return 0;
}

在这里插入图片描述

http://www.xdnf.cn/news/12963.html

相关文章:

  • Python学习——数组的行列互换
  • VSCode内网安装插件
  • 飞算 JavaAI 2.0.0:开启老项目迭代维护新时代
  • 零基础入门 C 语言基础知识(含面试题):结构体、联合体、枚举、链表、环形队列、指针全解析!
  • SpringCloud——微服务
  • Reasoning over Uncertain Text by Generative Large Language Models
  • NLP学习路线图(三十二): 模型压缩与优化
  • AWS 公开数据集下载与操作说明
  • RabbitMQ入门
  • 多线程3(Thread)
  • 平衡二叉树:让搜索效率飞升的树形艺术
  • 初入 python Django 框架总结
  • 大话软工笔记—需求调研的准备
  • Perplexity AI:重塑你的信息探索之旅
  • amd64 -- buildx linux 镜像 Docker docker
  • Spring Boot微服务架构(十四):传统架构与微服务架构的开发成本对比分析
  • 联邦学习的创新方向
  • 双指针详解
  • 一键搭建 WordPress + MySQL + phpMyAdmin 环境(支持 PHP 版本选择 自定义配置)
  • 浮点数运算和精度总结
  • ​​​​​​​6板块公共数据典型应用场景【政务服务|公共安全|公共卫生|环境保护|金融风控|教育科研]
  • 简约商务通用宣传年终总结12套PPT模版分享
  • 服务器 | Centos 9 系统中,如何部署SpringBoot后端项目?
  • 随便刷刷web题
  • 7.Pandas 数据可视化图-2
  • Cilium动手实验室: 精通之旅---12.Cilium Egress Gateway - Lab
  • ABP vNext 与 HDFS 数据湖存储集成
  • epoll+线程池
  • 正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-12.1 Linux内核启动流程简介
  • 第二章 无刷电机硬件控制