题目传送门
思路提供
这是一道简单的深搜题。
我们可以从第一个点开始搜索,如果我们再一次找到了第一个点,那么我们一定就能找到一个环,因为我们是从第一个点(即最小的点),开始搜索,所以我们所得到的数的字典序一定是最小的,所以我们只要记录下搜索时的每个点到最后的时候输出就可以了。
AC code
#include<bits/stdc++.h>
using namespace std;
int n,x,y,a[55][55],be[55],ans[55],flag;
void dfs(int x,int cnt){
if(flag) return ;//flag==1说明已经输出答案了,所以就不用继续找了,不然会死循环
ans[cnt]=x;
if(cnt==n){//个数达到
if(a[x][1]==1){
for(int i=1;i<=cnt;i++){
cout<<ans[i]<<" ";
}//输出答案,并给flag赋值
flag=1;
}
return ;
}
for(int i=1;i<=n;i++){
if(a[x][i] && be[i]==0){//一定是没有走过的值
be[i]=1;
dfs(i,cnt+1);//深搜模板,记得要还原现场
be[i]=0;
}
}
}
int main(){
cin>>n;
while(cin>>x>>y) a[x][y]=a[y][x]=1;//由于不知道有几个数,所以用 while 读入,记得要记录双向的
be[1]=1;//开始第一个点一定要标记为已走过
dfs(1,1);
return 0;
}
标签:cnt,int,复原,dfs,55,flag,ans,P1718,图形
From: https://www.cnblogs.com/is-02/p/17686681.html