#include<iostream> #include<algorithm> #include<vector> #include<stack> using namespace std; int m, n, start; //start 为起点 vector<bool> visited; vector<vector<int> > v; stack<int> s; //代码精髓 void dfs(int root) { visited[root] = 1; //题目要求从编号小的优先遍历 我就排序了一遍 sort(v[root].begin(), v[root].end()); for (int i = 0; i < v[root].size(); i++) { //如果存在能继续遍历的点 if (!visited[v[root][i]]) { s.push(root); //将前一个点入栈 printf("%d ", v[root][i]); //输出下一个点 dfs(v[root][i]); //从下一个点开始继续深度优先遍历 } } //如果这个点没有能继续深度优先遍历的点 if (root != start) { //输出前一个点 printf("%d ", s.top()); //跳出这次递归 s.pop(); } } int main() { cin >> m >> n >> start; v.resize(m+1); visited.resize(m + 1, 0 ); for (int i = 1; i <= n; i++) { int a, b; cin >> a >> b; v[a].push_back(b); v[b].push_back(a); } //构建邻接表 printf("%d ", start); //先输出起点 dfs(start); for (int i = 1; i <= m; i++) { if (!visited[i]) { cout << 0; break; } } }
时间: 2024-03-08 22:51:17 浏览: 54
使用include <iostream>时一定要加using namespace std
以下是将该段代码转换为C语言的过程:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1005 // 定义最大顶点数
int m, n, start; // start 为起点
int visited[MAXN]; // 定义 visited 数组
int v[MAXN][MAXN]; // 定义邻接矩阵
int top = -1; // 定义栈顶指针
// 定义栈的操作
int isEmpty() {
return top == -1;
}
void push(int x) {
top++;
visited[top] = x;
}
int pop() {
int x = visited[top];
top--;
return x;
}
// 定义 dfs 函数
void dfs(int root) {
visited[root] = 1; // 标记该节点已经被访问
for (int i = 1; i <= m; i++) {
if (v[root][i] && !visited[i]) { // 如果存在能继续遍历的点
push(root); // 将前一个点入栈
printf("%d ", i); // 输出下一个点
dfs(i); // 从下一个点开始继续深度优先遍历
}
}
if (root != start) { // 如果这个点没有能继续深度优先遍历的点
printf("%d ", pop()); // 输出前一个点
}
}
int main() {
scanf("%d%d%d", &m, &n, &start);
for (int i = 1; i <= n; i++) {
int a, b;
scanf("%d%d", &a, &b);
v[a][b] = v[b][a] = 1; // 构建邻接矩阵
}
printf("%d ", start); // 先输出起点
dfs(start);
for (int i = 1; i <= m; i++) {
if (!visited[i]) {
printf("0");
break;
}
}
return 0;
}
```
经过转换,该段代码就可以在C语言环境下运行了。
阅读全文