深度优先算法(DFS)

  1. 前言:英文缩写为DFS,可笑的是,我最早去HP公司面试做笔试题的时候, 竟然没看出来是什么意思,当然即使知道是这个算法,当时也不太会写。本科都是学过的,就是后来忘记了。
  2. 思路说明:理解深度优先算法的关键在于解决“当下该如何做”。至于下一步应该如何做,和当下应该如何做是一样的,对!就是用递归!自己调用自己!
  3. 递归函数模型:
void dfs(int step)
{
    判断边界,如果到了边界当然直接返回啦
    尝试每一种可能结果for(i=0;i<n;i++)
    {
        处理当前步
        继续下一步dfs(step + 1)
    }
    返回
}

4.应用于图的遍历:
这里我们用二位数组储存图,叫做图的邻接矩阵存储法。
《深度优先算法(DFS)》

#include<stdio.h>

int graph[100][100];
int book[100];
int m,n,sum;

int que[10000],head,tail;

void dfs(int cur)
{
    int i;
    printf("%d ",cur);
    sum++;
    if(sum == n)
    {
        return;
    }
    for(i=0;i<n;i++)
    {
        if(graph[cur][i] == 1 && book[i] == 0)
        {
            book[i] = 1;
            dfs(i);
        }
    }
    return;
}
int main()
{
    int i,j,m,a,b;
    printf("Please input n lines and columns and m links to build a matrix!\n");
    scanf("%d %d",&n,&m);
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            if(i == j)
                graph[i][j] = 0;
            else
                graph[i][j] = 99999999;
    for(i=0;i<m;i++)
    {
        printf("Set linked line between nodes!\n");
        scanf("%d %d",&a,&b);
        graph[a][b] = graph[b][a] = 1;
    }
    book[0] = 1;
    dfs(0);
    //bfs(0);
    return 0;
}

运行结果:

Please input n lines and columns and m links to build a matrix!
5 5
Set linked line between nodes!
0 1
Set linked line between nodes!
0 2
Set linked line between nodes!
0 4
Set linked line between nodes!
1 3
Set linked line between nodes!
2 4
0 1 3 2 4
Press any key to continue

    原文作者:DFS
    原文地址: https://blog.csdn.net/ygdlx521/article/details/51496191
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞