DS图遍历–深度优先搜索

DS图遍历–深度优先搜索

DS图遍历–深度优先搜索

题目描述

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

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

代码框架如下:

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

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

输入

 

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

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

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

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

以此类推输入下一个示例

输出

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

样例输入

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

样例输出

0 2 1 3
0 3 2 1 4
#include<iostream>
#include<string>
using namespace std;
const int MaxLen = 20;
class Map {
private:
    bool vist[MaxLen];
    int matrix[MaxLen][MaxLen];
    int vexnum;
    void DFS(int v);
public:
    void setmatrix(int vnum, int mx[MaxLen][MaxLen]);
    void DFSTraverse();
};
void Map::setmatrix(int vnum, int mx[MaxLen][MaxLen]){
    int i, j;
    vexnum = vnum;
    for (i = 0; i < MaxLen; i++)
        for (j = 0; j < MaxLen; j++)
            matrix[i][j] = 0;
    for (i = 0; i < vexnum; i++)
        for (j = 0; j < vexnum; j++)
            matrix[i][j] = mx[i][j];
}
void Map::DFSTraverse(){
    for (int i = 0; i < MaxLen; i++)
        vist[i] = false;
    for (int i = 0; i < vexnum; i++)
        if (!vist[i])
            DFS(i);
}
void Map::DFS(int v){
    int w, i, k;
    cout << v << " ";
    vist[v] = true;
    int *adjvex = new int[vexnum];
    for (i = 0; i < vexnum; i++)
        adjvex[i] = -1;
    k = 0;
    for (i = 0; i < vexnum; i++)
        if (matrix[v][i] == 1)
            adjvex[k++] = i;
    i = 0;
    for (w=adjvex[i]; w >=0;w=adjvex[++i])
    {
        if (!vist[w])
            DFS(w);
    }
    delete[]adjvex;
}
int main(){
    int t;
    cin >> t;
    while (t--){
        int n;
        cin >> n;
        int a[MaxLen][MaxLen];
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                cin >> a[i][j];
        Map map;
        map.setmatrix(n, a);
        map.DFSTraverse();
        cout << endl;
    }
}

 

转载于:https://www.cnblogs.com/Liu269393/p/10222700.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101221.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 四阶龙格库塔法的基本原理_隐式龙格库塔法

    四阶龙格库塔法的基本原理_隐式龙格库塔法龙格库塔法的基本原理该算法是构建在数学支持的基础之上的。对于一阶精度的拉格朗日中值定理有:对于微分方程:y’=f(x,y)y(i+1)=y(i)+h*K1K1=f(xi,yi)当用点xi处的斜率近似值K1与右端点xi+1处的斜率K2的算术平均值作为平均斜率K*的近似值,那么就会得到二阶精度的改进拉格朗日中值定理:y(i+1)=y(i)+[h*(K1+K2)/2]K1=f(xi,yi)K2=f(…

    2025年8月21日
    3
  • 每天学点GDB 3

    每天学点GDB 3

    2021年8月22日
    58
  • java int最大值和最小值_excel中求最大值和最小值

    java int最大值和最小值_excel中求最大值和最小值Java中Integer的最大值和最小值.JavaByte的最大值和最小值.Javafloat的最大值和最小值.Javalong的最大值和最小值.

    2025年10月7日
    2
  • when和while的区别和用法_when后面加do还是doing

    when和while的区别和用法_when后面加do还是doingwhen和while的区别主要有:指代不同、从句动词不同、时间状态不同、用法不同等。1、指代不同:when是atorduringthetimethat既指时间点,也可指一段时间,while是duringthetimethat只指一段时间。2、从句动词不同:when引导的时间状语从句中的动词可以是终止性动词,也可以是延续性动词,而while从句中的动词必须是延续性动词。3、时间状态不同:when说明从句的动作和主句的动作可以是同时,也可以是先后发生,while则强调主句的动作在从句

    2025年8月25日
    5
  • MicroBlaze使用_char* malloc

    MicroBlaze使用_char* malloc转自http://blog.163.com/gcs_gcs/blog/static/17448606620121193113914/在最近的工程中,需要用到PS/2键盘和鼠标作为控制输入,所以在网上找了一些相关的资料,内容很丰富,看来已经有很多人做过了这方面的编程。本篇Blog算是实践总结,为以后的开发积累一些基础知识。MicroBlaze支持重启(reset),中断(interrupt),暂…

    2025年8月18日
    7
  • Pytest(10)assert断言[通俗易懂]

    Pytest(10)assert断言[通俗易懂]前言断言是写自动化测试基本最重要的一步,一个用例没有断言,就失去了自动化测试的意义了。什么是断言呢?简单来讲就是实际结果和期望结果去对比,符合预期那就测试pass,不符合预期那就测试failed

    2022年8月6日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号