【圖論】【DFS】B Hamiltonish Path
阿新 • • 發佈:2018-12-12
分析:
很簡單的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]); }