DS图遍历--深度优先搜索

DS图遍历--深度优先搜索_第1张图片

Description

给出一个图的邻接矩阵,对图进行深度优先搜索,从顶点0开始

注意:图n个顶点编号从0到n-1

如果图不连通,则对尚未访问的编号结点继续进行深度优先搜索,直到所有结点被访问

Input

第一行输入t,表示有t个测试实例

第二行输入n,表示第1个图有n个结点

第三行起,每行输入邻接矩阵的一行,以此类推输入n行

第i个结点与其他结点如果相连则为1,无连接则为0,数据之间用空格隔开

以此类推输入下一个示例

Output

每行输出一个图的深度优先搜索结果,结点编号之间用空格隔开

Sample

#0
Input

Copy

2
4
0 0 1 1
0 0 1 1
1 1 0 1
1 1 1 0
5
0 0 0 1 1
0 0 1 0 0
0 1 0 1 1
1 0 1 0 0
1 0 1 0 0
Output

Copy

0 2 1 3 
0 3 2 1 4 

思路;

本题要求从0开始进行深度优先搜索,那我们起始点就是0,然后从0开始dfs递归。
dfs(i)函数, i 表示出发点,然后里面遍历邻接矩阵数组,可以tu[i][j]=1,表示 i 可以到 j ,然后就对 j进行深度优先搜索,dfs(j)
然后出发点 j 找到一个 k 可以到的点重复步骤,如果不存在 j 能到的点 k ,那是不是函数就结束了,递归返回上一层,就是出发点变成i,然后如果 i 还能到达别的数,那是不是就是别的数为 j 了,然后进行dfs(j)

关键代码

DS图遍历--深度优先搜索_第2张图片

这里我想了一个简单的例子让大家跑一下,
a b //表示a可以到达b

1 2
2 3
2 4

这里我们从1开始,然后第一个输出 1 ,然后 1 可以到2,
然后2作为出发点,2可以到3,
然后3作为出发点,3作为出发点没有可以到达的,递归栈就返回到2作为出发点,
然后2作为出发点继续遍历发现2可以到4
然后4没有可以到了,且所有的点都走过了,深搜完成了。

所以最后输出结果是1 2 3 4

代码:

#include
using namespace std;
const int maxn = 1e3 + 10;
int tu[maxn][maxn];//邻接矩阵
int flag[maxn];///flag数组存取判断这个点是否已经走过
int n;
void dfs(int i)///深度优先遍历
{
    cout << i << " ";///输出i,记录路径
    flag[i] = 1;///设置i已经走过,所以flag[i]=1,设置为他已经走过了
    for (int j = 0; j < n; j++)///然后遍历i可以到达的点,i存在到达的点就开始对那个j点搜索
    {
        if (flag[j] == 0 && tu[i][j] == 1)///tu[i]i[j]表示可以到j,flag[j]=0,表示j还没走过
        {
            dfs(j);///所以可以对j进行深度搜索。
        }
    }
}
void dfstraverse()///
{
    for (int i = 0; i < n; i++)///本题默认开始从0作为起点开始深搜
    {
        if (flag[i] == 0)///如果这个i点没有走过,就从这个i点开始进行深搜
        {
            dfs(i);///对i点开始dfs搜索
        }
        //这里是如果从0进行搜索无法到达某个点,那之后就要从那个无法到达的点搜索
        //0能到达的j点flag[j]都会变为1,那无法到达的就会是flag[j]==0,
        //所以要用循环遍历所有的点并且判断是否有被走过
    }
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        cin >> n;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                cin >> tu[i][j];///构建图
            }
        }
        for (int i = 0; i < n; i++)//默认把0放进去了
        {
            flag[i] = 0;///最初所有点都设为没有遍历过
        }
        dfstraverse();///开始深度优先搜索
        cout << endl;
    }
    return 0;
}

你可能感兴趣的:(深度优先,算法)