图的广度优先遍历(BFS)和深度优先遍历(DFS)C++实现

news/2024/7/20 20:25:31 标签: BFS, DFS, 深度优先, 广度优先

问题描述

对下图分别进行广度和深度优先遍历。期望的输出结果为:

BFS:s-1-2-3-4-t
DFS:s-1-3-t-4-2

例图

基本思路

广度优先:借助标记数组+队列,将与当前节点关联的所有未访问过的节点加到队列里,按队列次序输出即可,输出一个,出队一个。

深度优先:借助标记数组,依次递归遍历与当前节点关联的所有未访问过的节点,每次输出当前节点。

算法实现

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

void BFS(vector<int> V, vector<vector<int> > E);
void DFS(vector<int> V, vector<vector<int> > E, int cur, vector<bool> *visited);

void BFS(vector<int> V, vector<vector<int> > E){
    int n = V.size();
    vector<bool> visited(n); //创建并自动初始化vector,默认值为false
    queue<int> q;
    q.push(0);
    visited[0] = true;
    while(!q.empty()){
        int cur = q.front();
        for (int i=0; i<n; i++){
            if (!visited[i] && E[cur][i]!=0){
                q.push(i);
                visited[i] = true;
            }
        }
        cout << V[cur] << endl;
        q.pop();
    }

}

//注意visited需要引用传递
void DFS(vector<int> V, vector<vector<int> > E, int cur, vector<bool> *visited){
    cout << V[cur] << endl;
    (*visited)[cur] = true;
    for (int i=0; i<V.size(); i++) {
        if (!(*visited)[i] && E[cur][i]!=0) {
            DFS(V, E, i, visited);
        }
    }
}

int main()
{
    vector<int> V = {1, 2, 3, 4, 5, 6};
    vector<vector<int> > E = {{0, 8, 12, 0, 0, 0},
                              {0, 0, 0, 6, 10, 0},
                              {0, 2, 0, 10, 0, 0},
                              {0, 0, 0, 0, 0, 8},
                              {0, 0, 0, 2, 0, 10},
                              {0, 0, 0, 0, 0, 0}};
    cout << "BFS:" << endl;
    BFS(V, E);

    vector<bool> visited(V.size()); //创建并自动初始化vector,默认值为false
    cout << "DFS:" << endl;
    DFS(V, E, 0, &visited);
    return 0;
}


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

相关文章

android 队列管理器,Android架构组件WorkManager详解

WorkManager架构组件是用来管理后台工做任务。这个时候你可能会奇怪了Android不是已经 有不少管理后台任务的类了么&#xff0c;好比JobScheduler, AlarmManger、在好比AsyncTask, ThreadPool。WorkManager。WorkManager的优点在哪里&#xff0c;咱们为啥要使用WorkManager。咱…

PAT乙级真题 1001 害死人不偿命的(3n+1)猜想 C++实现

题目 卡拉兹(Callatz)猜想&#xff1a; 对任何一个正整数 n&#xff0c;如果它是偶数&#xff0c;那么把它砍掉一半&#xff1b;如果它是奇数&#xff0c;那么把 (3n1) 砍掉一半。这样一直反复砍下去&#xff0c;最后一定在某一步得到 n1。卡拉兹在 1950 年的世界数学家大会上公…

弱磁扩速

一般&#xff0c;永磁同步电机在基频以下采用的控制策略是&#xff1a;最大转矩电流比控制。可以得到转矩和Id Iq的关系如下&#xff1a; 因为q轴代表永磁转矩&#xff08;Tem&#xff09;,恒转矩曲线上各点是永磁转矩和磁阻转矩的合成。当转矩较小时,最大转矩电流比轨迹靠近q轴…

android加载字体库缓慢,浅析Android加载字体包及封装的方法

TextView加载字体包在 Android 中&#xff0c;若需要使得某个TextView加载字体包&#xff0c;使用以下方式即可&#xff1a;Typeface typeFace Typeface.createFromAsset(getAssets(),"fonts/Bold.otf");textView.setTypeface(typeFace);至于字体包的位置&#xff1a…

PAT乙级真题 1002 写出这个数 C++实现

题目 读入一个正整数 n&#xff0c;计算其各位数字之和&#xff0c;用汉语拼音写出和的每一位数字。 输入格式&#xff1a; 每个测试输入包含 1 个测试用例&#xff0c;即给出自然数 n 的值。这里保证 n 小于 10 ​100 ​​ 。 输出格式&#xff1a; 在一行内输出 n 的各位数字…

android activity上下切换动画,Android Activity切换上下抽屉效果

Activity之间的切换效果动画有很多种&#xff0c;常见的有位移与渐变&#xff0c;缩放用的比较少&#xff0c;旋转就更不用说了。针对位移来说&#xff0c;是一个Activity出的同时另一个Actvity进&#xff0c;位移还有另一种方式就是抽屉效果&#xff0c;抽屉效果也是位移的一种…

Java代码在本地运行没有问题。上传到阿里云服务器后。出现了中文乱码解决

java -Dfile.encodingUTF-8 -jar project.jar转载于:https://www.cnblogs.com/Java-Starter/p/9249604.html

PAT乙级真题 1003 我要通过! C++实现

题目 “答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件&#xff0c;系统就输出“答案正确”&#xff0c;否则输出“答案错误”。 得到“答案正确”的条件是&#xff1a; 字符串中必须仅有 P、 A、 T这…