1. 程式人生 > >【圖論】【DFS】B Hamiltonish Path

【圖論】【DFS】B Hamiltonish Path

分析:

很簡單的DFS水題。 很容易發現,這個起點和終點的條件是很容易構造的,我們只需要隨便從一個點出發,向其中某個方向一直dfs下去,直到走不動了,那個點設為起點。再從另一個方向一直dfs下去,直到走不動了,設為終點。

找起點用棧就可以了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<stack>
#define SF scanf
#define PF printf
#define MAXN 100010
using namespace std;
struct node{
	int x;
	node *nxt;	
}edge[MAXN*2];
node *head[MAXN],*ncnt=edge;
void add_edge(int x,int y){
	++ncnt;
	ncnt->x=y;
	ncnt->nxt=head[x];
	head[x]=ncnt;
}
int u,v;
stack<int> st;
vector<int> ans;
bool vis[MAXN];
void find_ans(int x,int flag){
	vis[x]=1;
	if(flag==0)
		st.push(x);
	else
		ans.push_back(x);
	for(node *v=head[x];v!=NULL;v=v->nxt){
		int u=v->x;
		if(vis[u]==1)
			continue;	
		find_ans(u,flag);
		break;
	}
}
int n,m;
int main(){
	SF("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		SF("%d%d",&u,&v);	
		add_edge(u,v);
		add_edge(v,u);
	}
	find_ans(1,0);
	while(1){
		int x=st.top();
		st.pop();
		if(st.empty())
			break;
		ans.push_back(x);	
	}
	find_ans(1,1);
	PF("%d\n",int(ans.size()));
	for(int i=0;i<int(ans.size());i++)
		PF("%d ",ans[i]);
}