当前位置: 首页 > news >正文

根据邻接矩阵对图进行深度广度优先搜索

题目:以邻接矩阵给出一张以整数编号为顶点的图,其中0为不相连,1为相连。按深度和广度优先进行遍历,输出全部结果。要求遍历时优先较小的顶点。

#include <deque> #include <iostream> #include <stack> #include <vector> #include <algorithm> using namespace std; class Graph { private: int V; vector<vector<int>> adj; public: Graph(int vertices, int** arr): V(vertices) { adj.resize(V); for (int i = 0; i < V; i++) { for (int j = 0; j < V; j++) { if (arr[i][j] == 1) { adj[i].push_back(j); } } sort(adj[i].begin(), adj[i].end()); } } void DFS(int start) { stack<int> s; vector<bool> visited(V, false); //第一个参数是元素个数,第二个是元素的初始值 s.push(start); while (!s.empty()) { int temp = s.top(); s.pop(); if (!visited[temp]) { visited[temp] = true; cout << temp << " "; } for (auto it = adj[temp].rbegin(); it != adj[temp].rend(); it++) { //利用反向迭代器得到里面的数据 if (!visited[*it]) { s.push(*it);//这里必须要用*it是为了解引用迭代器,否则it就只是个位置指示器,而不是一个具体的数据 } } } cout << endl; } void WFS(int start) {//统一在入队的时候进行让visited数组为true deque<int> q; vector<bool> visited(V, false); //初始节点入队并标记 q.push_back(start); visited[start] = true; while (!q.empty()) { int v = q.front(); q.pop_front(); //if(!visited[v]){ cout << v << " "; //这里直接输出,不要再次检查 //} for (auto it = adj[v].begin(); it != adj[v].end(); it++) { if (!visited[*it]) { q.push_back(*it); visited[*it] = true; } } } cout << endl; } //这里需要注意的是,DFS使用的是栈,所以在出栈的时候标记访问,因为是所有元素一下全部进栈 //而WFS用的是队列,没访问完一个元素将他弹出的时候就访问他的neighbor并把他们入队 //所以这里就要求的每次入队的时候就标记访问 }; int main() { int size; cin >> size; int** maze = new int* [size]; for (int i = 0; i < size; i++) { maze[i] = new int[size]; } for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { int a; cin >> a; maze[i][j] = a; } } Graph graph(size, maze); cout << "DFS" << endl; for (int i = 0; i < size; i++) { graph.DFS(i); } cout << "WFS" << endl; for (int i = 0; i < size; i++) { graph.WFS(i); } for (int i = 0; i < size; i++) { delete[] maze[i]; } delete[] maze; }

需要注意两种遍历方法的不同。

http://www.cnnetsun.cn/news/93096.html

相关文章:

  • 跨境电商物流选择指南:从痛点分析到智能决策
  • 百度网盘解析工具:3分钟告别下载限速烦恼
  • FreeMove终极指南:Windows文件迁移的革命性解决方案
  • FeHelper全能工具箱:前端开发效率提升终极指南
  • QQ空间历史说说完整备份指南:永久珍藏你的数字记忆
  • 十大MCP Server方案,让DevOps步入智能新时代
  • VUE3:深入浅出探究pinia、provide\inject在多层组件页面是怎么使用的
  • Molecular Operating Environment (MOE) 完整安装与配置指南
  • LobeChat能否用于生成直播话术?电商主播提词器
  • 终极C++网络编程:构建高性能HTTP服务的完整指南
  • 显卡驱动终极清理指南:一键彻底解决兼容性问题
  • Zotero GPT:用AI重新定义文献管理效率
  • LobeChat与LangChain结合应用:打造复杂AI工作流
  • 突破60帧束缚:原神性能优化工具深度解析
  • 云计算作业—-V L AN实验
  • 当连锁巡检“听懂人话”:VLM技术下的智能运营新场景
  • 责任链模式(Chain of Responsibility):实现事件或请求的逐级处理与传递
  • SMUDebugTool深度探索:解锁AMD Ryzen系统的隐藏性能
  • JavaScript 中的单例模式:利用闭包、IIFE 或 ES Modules 实现线程安全的单例
  • CORS 机制中的预检请求(Preflight Request):为什么 OPTIONS 请求总是先于复杂请求发送?
  • Google Drive文件下载终极指南:简单快速解决下载难题
  • 面对一个新领域,如何快速摸清门道?试试“一键生成”研究地图
  • 终极指南:5步实现全球付费内容免费阅读
  • GBase 8s数据库SYSTIMESTAMP表达式介绍(上)
  • 从“秒级”到“毫秒级”:金仓如何让InfluxDB的“时序神话”黯然失色?
  • zotero-style插件深度解析:从零打造高效文献管理生态
  • 5倍推理加速:Axolotl缓存策略如何终结重复计算瓶颈
  • LobeChat能否部署在华为云弹性云服务器?国产化替代实践
  • LobeChat备份与恢复策略:防止重要对话丢失
  • Access Token 生命周期管理:详细设计 Token 的获取、缓存、续期和过期处理机制