#搜索#AT2368 [AGC013B] Hamiltonish Path


题目

求一条简单路径使得路径端点不能再被延伸


分析

一开始想到可能和度数有关,其实没必要,

随便以一个点作为路径中的点深搜两次即可


代码

#include 
#include 
#include 
#define rr register
using namespace std;
const int N=100011;
struct node{int y,next;}e[N<<1];
int b[2][N],v[N],as[N],n,et;
inline signed iut(){
	rr int ans=0; rr char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans;
}
inline void print(int ans){
	if (ans>9) print(ans/10);
	putchar(ans%10+48); 
}
inline void dfs(int x,int z){
	b[z][++b[z][0]]=x,v[x]=1;
	for (rr int i=as[x];i;i=e[i].next)
	    if (!v[e[i].y]) {dfs(e[i].y,z); break;}
}
signed main(){
	n=iut(),et=1;
	for (rr int m=iut();m;--m){
		rr int x=iut(),y=iut();
		e[++et]=(node){y,as[x]},as[x]=et;
		e[++et]=(node){x,as[y]},as[y]=et;
	}
	dfs(1,0),dfs(1,1),print(b[0][0]+b[1][0]-1),putchar(10);
	for (rr int i=b[0][0];i>1;--i) print(b[0][i]),putchar(32);
	for (rr int i=1;i<=b[1][0];++i) print(b[1][i]),putchar(32);
	return 0;
}

相关