题目
答案
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
vector<int> vec[1001],t;
int vis[1001],cnt=0;
void dfs(int tmp)
{
if(vis[tmp]==0)
{
vis[tmp]=1;
t.push_back(tmp);
cnt++;
}
for(int i=0;i<vec[tmp].size();i++)
{
if(vis[vec[tmp][i]]==0)
{
cnt++;
dfs(vec[tmp][i]);
t.push_back(tmp);
}
}
return;
}
int main()
{
memset(vis,0,sizeof(vis));
int n,m,start;
cin>>n>>m>>start;
while(m--)
{
int x,y;
cin>>x>>y;
vec[x].push_back(y);
vec[y].push_back(x);
}
for(int i=1;i<=n;i++)
sort(vec[i].begin(),vec[i].end());
dfs(start);
int flag=0;
for(int i=0;i<t.size();i++)
{
if(flag==0) flag=1;
else cout<<" ";
cout<<t[i];
}
if(cnt<n) cout<<" "<<0;
}
总结
本题使用深度遍历,同时使用了vector向量组存储相关信息
如果你是在深度遍历后将输出的结果反向输出,那就无法通过后两个节点。
在我们仔细审题后,发现这道题的本意是回溯,那么我们正好可以在递归中实现回溯,即在每个dfs后,将目标值压入向量t中
代码如下:
dfs(vec[tmp][i]);
t.push_back(tmp);