首先考虑正常的怎么做,就是一遍dfs,是\(O(n)\)的,然而这题在到达每一个点时都要输出它的下一个点才能到达下一个点,同时看到这个\(2n\)觉得不对劲,自然想到走过去走回来,耗2n
代码实现还是有点东西的,走过去好搞,但走回来时怎么办呢。我们想到dfs是一个栈,所以在要退出时输出就可以了
#include<bits/stdc++.h>
using namespace std;
int n,m,k,x,v[105][105];
bool vis[105];
void dfs(int u,int from){
if(u==n) exit(0);
cin>>k;
for(int i=1;i<=k;i++){
cin>>v[u][i];
}
for(int i=1;i<=k;i++){
if(vis[v[u][i]]==false){
vis[v[u][i]]=true;
cout<<v[u][i]<<endl;
dfs(v[u][i],u);
//vis[v[u][i]]=false;//已经去过就不用再去了
}
}
cout<<from<<endl;
cin>>k;
for(int i=1;i<=k;i++){
cin>>x;
}
}
int main(){
cin>>n>>m;
vis[1]=true;
dfs(1,0);
return 0;
}
标签:一个点,vis,abc305,dfs,实现,int,构造,105
From: https://www.cnblogs.com/wuhupai/p/18036292