赞
踩
编写程序对给定的有向图(不一定连通)进行深度优先遍历,图中包含n个顶点,编号为0至n-1。本题限定在深度优先遍历过程中,如果同时出现多个待访问的顶点,则优先选择编号最小的一个进行访问,以顶点0为遍历起点。
输入第一行为两个整数n和e,分别表示图的顶点数和边数,其中n不超过20000,e不超过50。接下来e行表示每条边的信息,每行为两个整数a、b,表示该边的端点编号,但各边并非按端点编号顺序排列。
输出为一行整数,每个整数后一个空格,即该有向图的深度优先遍历结点序列。
- 3 3
- 0 1
- 1 2
- 0 2
0 1 2
- 4 4
- 0 2
- 0 1
- 1 2
- 3 0
0 1 2 3
- #include<bits/stdc++.h>
- using namespace std;
- vector<int>v[20005];
- int visited[20005];
- void dfs(int cur){
- cout<<cur<<" ";
- visited[cur]=1;
- for(int i=0;i<v[cur].size();i++){
- if(visited[v[cur][i]]==0) dfs(v[cur][i]);
- }
- }
- int main(){
- int n,e,a,b;
- cin>>n>>e;
- for(int i=0;i<e;i++){
- cin>>a>>b;
- v[a].push_back(b);
- }
- for(int i=0;i<n;i++){
- sort(v[i].begin(),v[i].end());
- }
- for(int i=0;i<n;i++){
- if(visited[i]==0){
- dfs(i);
- }
- }
- }
#include<bits/stdc++.h>
:这是一个预处理指令,用于包含C++标准库的所有头文件。
using namespace std;
:这是一个命名空间的声明,允许你直接使用标准库的元素,而不需要在前面加上 std::
前缀。
vector<int> v[20005];
:定义了一个大小为20005的整数向量数组v,每个元素v[i]表示节点i的邻接节点列表。
int visited[20005];
:定义了一个整数数组visited,用于标记节点是否被访问过,初始化为0表示未访问,1表示已访问。
void dfs(int cur)
:这是一个递归深度优先搜索函数,用于遍历从当前节点cur
出发的连通分量。函数的主要作用是递归遍历当前节点的邻接节点,并将它们加入同一连通分量。
cur
的值,即将其打印出来。cur
标记为已访问(visited[cur] = 1)。cur
的邻接节点,如果某个邻接节点v[cur][i]
未被访问过(visited[v[cur][i]] == 0),则递归调用dfs(v[cur][i])
来继续遍历这个未访问的邻接节点。int main() { ... }
:主函数开始执行。
从标准输入中读取两个整数 n
和 e
,分别表示节点数和有向边数。
使用一个循环读取每条有向边的信息,每条边由两个整数 a
和 b
表示,表示从节点 a
到节点 b
有一条有向边。将这些信息存储在邻接表v
中,将节点b
添加到节点a
的邻接节点列表中。
对邻接表v
进行排序,以确保每个节点的邻接节点按升序排列,这有助于在DFS中按顺序访问邻接节点。
遍历所有节点(从0到n-1),如果节点尚未访问(visited[i] == 0
),则调用dfs(i)
来遍历以节点i
为起点的连通分量。
总之,这段代码通过DFS算法遍历有向图,找到图中的所有连通分量,并以深度优先的方式输出各个连通分量中的节点。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。