P1718 图形复原

题目传送门

思路提供

这是一道简单的深搜题。

我们可以从第一个点开始搜索,如果我们再一次找到了第一个点,那么我们一定就能找到一个环,因为我们是从第一个点(即最小的点),开始搜索,所以我们所得到的数的字典序一定是最小的,所以我们只要记录下搜索时的每个点到最后的时候输出就可以了。

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;
}
posted @ 2023-09-08 09:39  是002呀  阅读(29)  评论(0)    收藏  举报