深度优先算法学习

1: 从 1点出发到 15点

c 复制代码
#include <stdio.h>

#define MAX_NODES 100

typedef 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 : 如果有环 怎么遍历

c 复制代码
#include <stdio.h>

#define MAX_NODES 100

typedef 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![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b1f637d655634c9b8b154f3db2603cf2.png)

c 复制代码
#include <stdio.h>
#define MAX_NODES 100

typedef 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:期望输出环上的结点

c 复制代码
#include <stdio.h>

#define MAX_NODES 100

typedef 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;
}
相关推荐
FPGAI1 分钟前
Java学习之计算机存储规则、数据类型、标识符、键盘录入、IDEA
java·学习
CoovallyAIHub11 分钟前
纯视觉的终结?顶会趋势:不会联觉(多模态)的CV不是好AI
深度学习·算法·计算机视觉
CoovallyAIHub21 分钟前
一文读懂大语言模型家族:LLM、MLLM、LMM、VLM核心概念全解析
深度学习·算法·计算机视觉
四谎真好看29 分钟前
MySQL 学习笔记(运维篇1)
运维·数据库·笔记·学习·mysql·学习笔记
范纹杉想快点毕业1 小时前
嵌入式C语言实战开发详解
linux·运维·算法
闲看云起1 小时前
LeetCode day3-最长连续序列
算法·leetcode
hssfscv1 小时前
Javaweb学习笔记——Web
笔记·学习·web
随意起个昵称1 小时前
【题解学习】序列题
学习·算法
思通数科多模态大模型1 小时前
门店 AI 清洁系统:AI 语义分割 + 机器人清洁
大数据·人工智能·算法·目标检测·计算机视觉·自然语言处理·机器人
iAkuya1 小时前
(leetcode)力扣100 27合并两个有序链表(迭代/递归)
算法·leetcode·链表