数据结构 图(上)

简介: 数据结构 图

1. DS图遍历–深度优先搜索


题目描述


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


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


代码框架如下:


7b9ebd0b67504bd8ac1ac1437bed87a6.png


eb749a5836dd442fb29f72eddcfe53af.png

输入


第一行输入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>
using namespace std;
const int Maxlen = 20;
class Map
{
private:
    bool Visit[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 < Maxlen; i++)
        for (j = 0; j < Maxlen; j++)
            Matrix[i][j] = mx[i][j];
}
void Map::DFSTraverse()
{
    int v;
    for (int i = 0; i < Maxlen; i++)
        Visit[i] = false;
    for (int i = 0; i < Vexnum; i++)
    {
        if (!Visit[i])
            DFS(i);
    }
    cout << endl;
}
void Map::DFS(int v)
{
    int w, i, k;
    Visit[v] = true;
    cout << v << " ";
    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])
            AdjVex[k++] = i;
    i = 0;
    for (i = 0; i < k; i++)
    {
        w = AdjVex[i];
        if (!Visit[w])
            DFS(w);
    }
    delete[] AdjVex;
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        int n, i, j;
        cin >> n;
        int mx[Maxlen][Maxlen];
        for (i = 0; i < n; i++)
            for (j = 0; j < n; j++)
            {
                cin >> mx[i][j];
            }
        Map m;
        m.SetMatrix(n, mx);
        m.DFSTraverse();
    }
}

2. DS图遍历–广度优先搜索


题目描述


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


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


代码框架如下:


7be826f882ea4211b9bc832c7e523e81.png


输入


第一行输入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 3 1

0 3 4 2 1


参考代码

#include <iostream>
#include <queue>
using namespace std;
const int Maxlen = 20;
class Map
{
private:
    bool Visit[Maxlen];
    int Matrix[Maxlen][Maxlen];
    int Vexnum;
    void DFS(int v);
    void BFS(int v);
public:
    void SetMatrix(int vnum, int mx[Maxlen][Maxlen]);
    void DFSTraverse();
    void BFSTraverse();
};
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 < Maxlen; i++)
        for (j = 0; j < Maxlen; j++)
            Matrix[i][j] = mx[i][j];
}
void Map::DFSTraverse()
{
    int v;
    for (int i = 0; i < Maxlen; i++)
        Visit[i] = false;
    for (int i = 0; i < Vexnum; i++)
    {
        if (!Visit[i])
            DFS(i);
    }
    cout << endl;
}
void Map::DFS(int v)
{
    int w, i, k;
    Visit[v] = true;
    cout << v << " ";
    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])
            AdjVex[k++] = i;
    i = 0;
    for (i = 0; i < k; i++)
    {
        w = AdjVex[i];
        if (!Visit[w])
            DFS(w);
    }
    delete[] AdjVex;
}
void Map::BFSTraverse()
{
    BFS(0);
}
void Map::BFS(int v)
{
    int w, u, i, k;
    int *Adjvex = new int[Vexnum];
    queue<int> Q;
    for (i = 0; i < Vexnum; i++)
        Visit[i] = false;
    for (v = 0; v < Vexnum; ++v)
    {
        if (!Visit[v])
        {
            cout << v << " ";
            Visit[v] = true;
            Q.push(v);
            while (!Q.empty())
            {
                u = Q.front();
                Q.pop();
                k = 0;
                for (i = 0; i < Vexnum; i++)
                    if (Matrix[u][i])
                        Adjvex[k++] = i;
                i = 0;
                for (i = 0; i < k; i++)
                {
                    w = Adjvex[i];
                    if(!Visit[w])
                    {
                        Visit[w] = true;
                        cout << w << " ";
                        Q.push(w);
                    }
                }
            }
        }
    }
    cout << endl;
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        int n, i, j;
        cin >> n;
        int mx[Maxlen][Maxlen];
        for (i = 0; i < n; i++)
            for (j = 0; j < n; j++)
            {
                cin >> mx[i][j];
            }
        Map m;
        m.SetMatrix(n, mx);
        m.BFSTraverse();
    }
}


相关文章
|
7月前
|
存储 算法 Go
Golang 数据结构:图
Golang 数据结构:图
94 0
|
6月前
|
存储 算法
数据结构===图
数据结构===图
|
5月前
|
算法 Python
逆袭之路!用 Python 玩转图的 DFS 与 BFS,让数据结构难题无处遁形
【7月更文挑战第12天】图的遍历利器:DFS 和 BFS。Python 中,图可表示为邻接表或矩阵。DFS 沿路径深入,回溯时遍历所有可达顶点,适合找路径和环。BFS 层次遍历,先近后远,解决最短路径问题。两者在迷宫、网络路由等场景各显神通。通过练习,掌握这些算法,图处理将游刃有余。
67 3
|
5月前
|
存储 算法 Python
“解锁Python高级数据结构新姿势:图的表示与遍历,让你的算法思维跃升新高度
【7月更文挑战第13天】Python中的图数据结构用于表示复杂关系,通过节点和边连接。常见的表示方法是邻接矩阵(适合稠密图)和邻接表(适合稀疏图)。图遍历包括DFS(深度优先搜索)和BFS(广度优先搜索):DFS深入探索分支,BFS逐层访问邻居。掌握这些技巧对优化算法和解决实际问题至关重要。**
51 1
|
6月前
|
存储
数据结构学习记录——如何建立图(邻接矩阵、邻接表-图节点的结构、创建并初始化、插入变、完整图的建立)
数据结构学习记录——如何建立图(邻接矩阵、邻接表-图节点的结构、创建并初始化、插入变、完整图的建立)
97 0
|
6月前
|
存储 算法
数据结构学习记录——图应用实例-六度空间(题目描述、算法思路、伪代码及解读、图解)
数据结构学习记录——图应用实例-六度空间(题目描述、算法思路、伪代码及解读、图解)
69 0
|
6月前
|
存储 算法 安全
数据结构学习记录——图应用实例-拯救007(问题描述、解题思路、伪代码解读、C语言算法实现)
数据结构学习记录——图应用实例-拯救007(问题描述、解题思路、伪代码解读、C语言算法实现)
47 0
|
6月前
|
存储 C语言
数据结构学习记录——图的遍历(深度优先搜索、广度优先搜索、为什么需要两种遍历、图不连通怎么办)
数据结构学习记录——图的遍历(深度优先搜索、广度优先搜索、为什么需要两种遍历、图不连通怎么办)
72 0
|
6月前
|
存储 机器学习/深度学习
数据结构学习记录——什么是图(抽象数据类型定义、常见术语、邻接矩阵表示法、邻接表表示法)
数据结构学习记录——什么是图(抽象数据类型定义、常见术语、邻接矩阵表示法、邻接表表示法)
74 0
|
7月前
|
算法
【高阶数据结构】图 -- 详解(下)
【高阶数据结构】图 -- 详解(下)