[邻接表形式]有向图的建立与深度,广度遍历

news/2024/7/15 18:11:34 标签: 图论, 深度优先, 有向图, 算法, 数据结构

目录

DirectedGraph类的构成

构造函数

析构函数

深度优先遍历

广度优先遍历


前文回顾:

[邻接矩阵形式]无向图的建立与深度,广度遍历_☆迷茫狗子的秘密基地☆-CSDN博客目录MGraph类构造函数深度优先遍历广度优先遍历MGraph类const int N = 10;int visit[N]; // 顶点是否被访问template<typename DataType>class MGraph//无向图{public: MGraph(DataType a[], int n, int e); ~MGraph(){} void DF(int x); //深度优先遍历 void BF(int x);https://blog.csdn.net/qq_39391544/article/details/120943744?spm=1001.2014.3001.5501



DirectedGraph类的构成

const int N = 10;
int visit[N];

struct ConnectNode{ //邻接节点的坐标
    int site;
    ConnectNode* next;
};

template<typename DataType>
struct VertexNode   //顶点表
{
    DataType value;
    ConnectNode* firstEdge;
};

template<typename DataType>
class DirectedGraph{ //有向图
public:
    DirectedGraph(DataType a[], int n, int e);
    ~DirectedGraph();
    void DF(int x);
    void BF(int x);

private:
    VertexNode<DataType> v[N];
    int vNum,edgeNum;
};

构造函数

template<typename DataType>
DirectedGraph<DataType>::DirectedGraph(DataType a[], int n, int e):vNum(n),edgeNum(e)
{
    for(int i = 0; i < vNum; i++){
        v[i].value = a[i];
        v[i].firstedge = NULL;
    }

    int j,k;
    ConnectNode* s = NULL;
    for(int i = 0; i < edgeNum; i++){
        cin >> j >> k;
        s = new ConnectNode;
        s->site = k;
        s->next = v[j].firstEdge;
        v[j].firstEdge = s;
    }
}

析构函数

template<typename DataType>
DirectedGraph<DataType>::~DirectedGraph()
{
    ConnectNode *p = NULL, *q = NULL;

    for(int i = 0; i < vNum; i++){
        p = q = v[i].firstEdge;
        while(p){
            p = p->next;
            delete q;
            q = p;
        }
    }
}

深度优先遍历

template<typename DataType>
void DirectedGraph<DataType>::DF(int x)
{
    cout << v[x].value << endl;
    visit[x] = 1;

    ConnectNode *p = v[x].firstEdge;
    while(p)
    {
        if(visit[p->site]) DF(p->site);
        p = p->next;
    }
}

广度优先遍历

template<typename DataType>
void DirectedGraph<DataType>::BF(int x)
{
    int Q[N];
    int front = -1, rear = -1;
    ConnectNode* p = NULL;

    cout << v[x].value << endl;
    visit[x] = 1;
    Q[++rear] = x;
    while(front != rear)
    {
        int t = Q[++front];
        p = v[t].firstEdge;
        while (p)
        {
            if(!visit[p->site]){
                cout << v[p->site].value << endl;
                visit[p->site] = 1;
                Q[++rear] = p->site;
            }
            
            p = p->next;
        } 
    }
}


http://www.niftyadmin.cn/n/816646.html

相关文章

Leecode刷题笔记 二叉树

二叉树的中序遍历 这种方法是首先从头走到尾&#xff0c;把根节点和各层左儿子节点全部走一遍&#xff0c;走到头之后此时root已经是None了。这时候再从栈里弹出一个点给root&#xff0c;该点其实就是root上一个访问的点&#xff0c;也是最底层的那个左节点。此时再看该节点是…

[数组模拟] AcWing 847. 图中点的层次

输入样例&#xff1a; 4 5 1 2 2 3 3 4 1 3 1 4输出样例&#xff1a; 1 思路: 所有边的长度都是 1, 权值相同求有向图最短路, 广度优先即可 ,因为要求的是1~n的距离, 我们另设一个数组d[i] 来表示1~i之间的距离 有关边的添加思路可以参考数组实现单双链表的快速操作[时间复…

PyTorch 60 分钟入门教程:数据并行处理

可选择&#xff1a;数据并行处理&#xff08;文末有完整代码下载&#xff09; 作者&#xff1a;Sung Kim 和 Jenny Kang 在这个教程中&#xff0c;我们将学习如何用 DataParallel 来使用多 GPU。 通过 PyTorch 使用多个 GPU 非常简单。你可以将模型放在一个 GPU&#xff1a; de…

python创建数组时的浅拷贝避坑

今天在刷题 5. 最长回文子串 时用动态规划做这道题&#xff0c;创建二维数组时用 sizelen(s)dp[[False]*size]*size创建数组&#xff0c;最后明明代码没问题&#xff0c;有些样例就是过不了。最后想起来好像是因为浅拷贝。 其实这样的数组初始化方法就是下面这种&#xff1a; …

[D-OJ练习] 求无向图中某顶点的度

已知无向图的顶点为字符型&#xff0c;要求采用邻接矩阵表示&#xff0c;图中顶点序号按字符顺序排列&#xff0c;从键盘输入图中顶点的个数、边的条数、顶点的信息和边的组成等。求某顶点的度是多少&#xff1f; 输入描述 第一行输入无向图的顶点数和边的条数&#xff0c;以空…

npm安装依赖包 --save-dev 和 --save; package.json的devDependencies和dependencies 的区别!...

以前一直在纠结一个npm安装的包依赖管理的问题。是这样的&#xff1a; 我们在使用npm install 安装模块或插件的时候&#xff0c;有两种命令把他们写入到 package.json 文件里面去&#xff0c;他们是&#xff1a;--save-dev或--save 首先需要说明的是Dependencies一词的中文意思…

Leecode刷题笔记 动态规划

动态规划的三个步骤&#xff1a; 1.找到状态转移方程 2.将每个状态的结果按顺序存储 3.指定输出结果位于存状态的数组的位置 最大上升子序列和 对于给定的序列&#xff0c;会有很多个上升子序列&#xff0c;对每个上升子序列求和&#xff0c;找到一个数组的所有上升子序列中 …

python语法笔记

in在各数据结构中的时间复杂度&#xff1a; in在列表中的时间复杂度是 O(N) in在set、字典等中的时间复杂度是 O(1) set()的实现其实就是字典 定义函数中self的作用&#xff1a; 比如 class muffledcalculator&#xff1a; muffledFalse def calc&#xff08;self&#xff0…