#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define N 1001
int co=0;
int flag;
int flag2[2*N];
int que[N][N];
//数量
int op[2*N];
void print_tree(int start, int n)
{
flag2[start]=1;
for (int j = 1; j <= n; j++)
{
if (que[start][j]&&!flag2[j])
{
flag2[j]=1;
//存在的话
if (!flag)
{
flag++;
cout << j;
}
else
{
cout << " " << j;
}
op[co++]=j;
print_tree(j, n);
}
}
}
int main()
{
int number, edge, start_pos;
cin >> number >> edge >> start_pos;
int node1, node2;
for (int j = 0; j < edge; j++)
{
cin >> node1 >> node2;
que[node1][node2] = que[node2][node1] = 1;
}
op[co++]=start_pos;
cout<<start_pos;
flag++;
print_tree(start_pos,number);
for( int j =co-2;j>=0;j--){
cout<<" "<<op[j];
}
if(co!=number){
cout<<" "<<"0";
}
}
第一个代码的话,是没有考虑到节点多次出现的可能的情况的。有一定的错误,第二个是正确的。
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>adj[1010];
int visit[1010];
int cou=0;
int flag=0;
void dfs(int s){
cou++;
if(flag==0){
printf("%d",s);flag=1;
}
else{
printf(" %d",s);
}
visit[s]=1;
int i;
for(i=0;i<adj[s].size();i++){
int next=adj[s][i];
int child=0;
if(visit[next]==0){
child=1;
dfs(next);
}
if(child==1){ //如果有孩子访问,则这个节点必会返回
printf(" %d",s);
}
}
}
int main(){
int n,m,start,i,c1,c2;
scanf("%d %d %d",&n,&m,&start);
for(i=0;i<m;i++){
scanf("%d %d",&c1,&c2);
adj[c1].push_back(c2);
adj[c2].push_back(c1);
}
for(i=1;i<=n;i++){
sort(adj[i].begin(),adj[i].end());
}
dfs(start);
if(cou!=n){
printf(" 0");
}
}
相比于第一个代码第二个更加简单,按照题目的要求,使用递归或者是使用数组来存储即可。