编写程序对给定的有向图(不一定连通)进行深度优先遍历,图中包含n个顶点,编号为0至n-1。本题限定在深度优先遍历过程中,如果同时出现多个待访问的顶点,则优先选择编号最小的一个进行访问,以顶点0为遍历起点。
输入格式:
输入第一行为两个整数n和e,分别表示图的顶点数和边数,其中n不超过20000,e不超过50。接下来e行表示每条边的信息,每行为两个整数a、b,表示该边的端点编号,但各边并非按端点编号顺序排列。
输出格式:
输出为一行整数,每个整数后一个空格,即该有向图的深度优先遍历结点序列。
输入样例1:
3 3
0 1
1 2
0 2
输出样例1:
0 1 2
输入样例2:
4 4
0 2
0 1
1 2
3 0
输出样例2:
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算法遍历有向图,找到图中的所有连通分量,并以深度优先的方式输出各个连通分量中的节点。