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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java小型图书馆管理系统

    java小型图书馆管理系统根据需求,建立了一个BookMgr类,该类为实现小型图书馆的各个需求。为了和用户有一个良好的交互,根据需求且满足要求中的隐藏条件,先命名了交互的菜单函数printMenu1(),代码如下:publicvoidprintMenu1(){          System.out.println(“欢迎使用图书馆管理系统”);          Syst

    2022年7月8日
    23
  • 线程通信(ITC)

    线程通信(ITC)为什么要通信通信是人的基本需求。而进程作为人的发明,自然脱离不了人的习性,也有通信需求。如果进程之间不进行任何通信,那么进程所能完成的任务就要大打折扣。例如,父进程在创建子进程后,通常须要监督子进程的状态,以便在子进程没有完成给定的任务时,可以再创建一个子进程来继续。这就需要父子进程间通信。而线程间的通信则需要更多。由于一个进程通常包括多个线程,这多个线程之间因资源共享自然地就存在一种合作关系。这种合作关系虽然可以表现为相互独立,但更多地时候是互相交互。这就是通信。就像舞台上的多个演员,他们之间是一种

    2022年6月19日
    53
  • vue插槽slot-scope_slot插槽的使用方法

    vue插槽slot-scope_slot插槽的使用方法vue中的插槽————slot什么是插槽?插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性。

    2022年8月4日
    8
  • 流水线设计的方法和作用「建议收藏」

    流水线设计的方法和作用「建议收藏」流水线设计从某种程度上可以提高系统频率,因此常用于高速信号处理领域,如果某个信号可以分为若干步骤处理,而且整个数据处理过程是单项的,即没有反馈运算和迭代运算,前一个步骤的输出就是下一个步骤的输入,可以考虑流水线设计来提高系统的频率。如下图所示:典型的流水线设计是将原本一个时钟周期完成的较大的组合逻辑通过合理的切割后分由多个时钟周期来完成,这样一来该部分逻辑运行的时钟频率就会有明显的提升,尤其当她是…

    2022年4月19日
    43
  • notepad中文显示乱码_csv文件打开乱码

    notepad中文显示乱码_csv文件打开乱码NotePad打开文件出现中文汉字乱码解决办法现象:出现中文汉字乱码:解决办法:先别着急用notepad修改编码1.用windows系统自带记事本打开,2,选择文件另存为3.如果看到:编码是UTF-84.修改编码改成ANSI再次用notepad打开一般就正常了。修改编码改成ANSI…

    2022年10月14日
    2
  • idea 2021.4.14激活码_通用破解码

    idea 2021.4.14激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    56

发表回复

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

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