深度优先算法学习

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;
}
相关推荐
c2385638 分钟前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
aaaameliaaa2 小时前
指针之总结
c语言·笔记·算法
宵时待雨2 小时前
优选算法专题9:哈希表
数据结构·算法·散列表
txzrxz2 小时前
最短路问题——Dijkstra 算法
数据结构·c++·算法·最短路·优先队列
gwf2162 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
caimouse2 小时前
protoc-gen-c 支持 proto3 `optional` 关键字修改记录
c语言·学习
noipp2 小时前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu
憧憬成为java架构高手的小白2 小时前
黑马八股--中间件学习之MQ(RabbitMQ)
学习·中间件
c238563 小时前
C/C++每日一练6
c语言·c++·算法
AI小码3 小时前
把动作「画」给视频世界模型,跨本体双向推演,李飞飞参与
大数据·人工智能·算法·ai·大模型·音视频·编程