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

番禺网站制作价格无锡cms建站

番禺网站制作价格,无锡cms建站,自建房设计图软件app,国家认可的赚钱游戏dfs 的两种写法 在看之前实现图的遍历 dfs 和拓扑排序 dfs 实现的代码的时候的感悟 图的遍历 dfs 和拓扑排序 dfs 的区别 0 → 1 ↓ ↓ 2 → 3图的邻接表表示: adjList[0] {1, 2}; adjList[1] {3}; adjList[2] {3}; adjList[3] {};正常的 DFS 遍历&#x…

dfs 的两种写法

在看之前实现图的遍历 dfs 和拓扑排序 dfs 实现的代码的时候的感悟

图的遍历 dfs 和拓扑排序 dfs 的区别

0 → 1
↓   ↓
2 → 3

图的邻接表表示:

adjList[0] = {1, 2};
adjList[1] = {3};
adjList[2] = {3};
adjList[3] = {};
  1. 正常的 DFS 遍历:

    从节点 0 开始执行 DFS,假设我们按照邻接表的顺序遍历:

    从节点 0 开始,访问 0,然后访问 0 的邻接节点 1 和 2

    从节点 1 开始,访问 1,然后访问 1 的邻接节点 3

    从节点 3 开始,访问 3,发现没有邻接节点

    回到节点 1,再回到节点 0,访问 2

    从节点 2 开始,访问 2,然后访问 2 的邻接节点 3(但 3 已经访问过了)

    DFS 遍历的顺序:0 -> 1 -> 3 -> 2

  2. 拓扑排序的 DFS 遍历:

    在拓扑排序中,我们使用栈存储节点,并确保先访问所有邻接节点再加入栈

    从节点 0 开始,访问 0,并标记为“正在访问”

    访问 0 的邻接节点 1,并标记为“正在访问”

    访问 1 的邻接节点 3,并标记为“正在访问”

    节点 3 没有邻接节点,标记为“已访问”,并将 3 放入栈中

    回到节点 1,标记为“已访问”,并将 1 放入栈中

    回到节点 0,访问 2,并标记为“正在访问”

    访问 2 的邻接节点 3(已访问过),因此直接标记 2 为“已访问”,并将 2 放入栈中

    回到节点 0,标记为“已访问”,并将 0 放入栈中

    拓扑排序的顺序:3 -> 1 -> 2 -> 0

总结两者的区别

DFS 遍历按照遇到的第一个未访问的邻接节点进行递归访问, 直接记录 节点的访问顺序

拓扑排序要求节点在加入结果时要等到其 所有邻接节点被完全访问 过,因此节点的加入顺序是倒序的(即后序遍历)

代码

原 dfs 遍历代码

void MyGraph::dfsVisit(int vertex, vector<bool>& visited, vector<int>& traversal) 
{visited[vertex] = true;traversal.push_back(vertex);for (const auto& edge : adjList[vertex])if (!visited[edge.first])dfsVisit(edge.first, visited, traversal); 
}void MyGraph::DFS(int startVertex) 
{vector<bool> visited(n, false); vector<int> traversal; dfsVisit(startVertex, visited, traversal);for (int vertex : traversal) cout << vertex << " ";cout << endl;
}

拓扑排序的 dfs 实现

bool dfs(int node, vector<vector<int>> &adj, vector<int> &visited, stack<int> &result)
{// 当前节点正在访问,图中有环if (visited[node] == 1)return false; // 当前节点已经访问过if (visited[node] == 2)return true; // 1. 对每个未被访问的节点执行 DFS,标记该节点为访问中visited[node] = 1; for (int neighbor : adj[node])// 2. 如果访问到某个已经在 “ 访问中 ” 状态的节点,则说明图中存在环,无法进行拓扑排序if (!dfs(neighbor, adj, visited, result))return false;// 3. DFS 完成后,标记节点为“已访问”,并将节点加入到结果栈(或者队列)中visited[node] = 2; // 标记为已访问result.push(node); // 将节点加入栈return true;
}vector<int> topologicalSortDFS(int n, vector<vector<int>> &edges)
{vector<vector<int>> adj(n);for (const auto &edge : edges)adj[edge[0]].push_back(edge[1]);vector<int> visited(n, 0); // 0: 未访问, 1: 正在访问, 2: 已访问stack<int> result;// 1. 对每个未被访问的节点执行 DFS,标记该节点为访问中for (int i = 0; i < n; ++i)if (visited[i] == 0)if (!dfs(i, adj, visited, result))return {}; // 如果存在环,返回空vector<int> order;while (!result.empty()){order.push_back(result.top());result.pop();}return order;
}

想到如果同样对 dfs 遍历的返回值改为 bool 值也可以写成

bool MyGraph::dfsVisit(int vertex, vector<bool> &visited, vector<int> &traversal)
{if (visited[vertex])return true;visited[vertex] = true;      traversal.push_back(vertex); for (const auto &edge : adjList[vertex])if (!dfsVisit(edge.first, visited, traversal))return false;return true;
}void MyGraph::DFS(int startVertex)
{vector<bool> visited(n, false); vector<int> traversal;          if (dfsVisit(startVertex, visited, traversal)){cout << "DFS Traversal: ";for (int vertex : traversal){cout << vertex << " ";}cout << endl;}
}
http://www.yayakq.cn/news/720648/

相关文章:

  • wordpress博客站点地图外链工具软件
  • 外国做营销方案的网站大学生商品网站建设
  • 网站登录页面制作ps做全屏网站画布要多大
  • 商城类网站总体功能策划旅游网站建设方案
  • 网站主题页上海外贸网站开发
  • 电子商务网站建设 市场分析新闻单位建设网站的意义
  • 揭阳专业网站建设设置网站标签
  • 成都快速建网站长沙网站排名技术
  • 建筑工程网上保健网站网络营销方式如何体现其连接功能及顾客价值
  • 宁国做网站做科技汽车的视频网站
  • 沧州南皮手机网站建设做网站id
  • 旅游网站的建设方案网站建设实战李静
  • 老区建设网站学生兼职做网站
  • 集团网站装饰公司营销型网站设计
  • 网站策划表学it需要什么学历基础
  • 专业工厂网站建设汽车网站名称
  • 网站怎么做移动的图片沈阳点金网站建设
  • 官方网站建设公司书生商友软件怎么样
  • 手机网站有吗城市网站建设摘要论文
  • 北京网站建设新闻天津手动网站建设调试
  • flash+xml地图网站如何查询自己的企业邮箱
  • 传统网站建设 成本中低端网站建设客户网
  • 想建设个人网站去那里建设网站建设维保合同范本
  • 网站手机客户端开发教程什么是自建站
  • 怎么选择一家好的网站建设公司心理咨询网站建设论文
  • 官方网站建设进度表竞价托管魏大帅
  • 网站界面设计的表现3d效果图制作软件
  • 自建站网站经典wordpress网站
  • 海南省建设注册中心网站seo入口
  • 网站外链建设有利于增加网站收录电子商务购物平台