直接用DFS深搜,检查了好久没能发现错误,贴上来以后慢慢看。。。
/* DFS深度优先搜索 Edge保存边 u{v,been} cnt记录走过的街道 如果没有就return ;继续递归 */ #include<vector> #include<algorithm> #include<iostream> #include<cstdio> #define MAXN 10001 using namespace std; struct Edge { int v; Edge(int _v=0):v(_v){} }; vector<Edge> E[MAXN]; inline void addedge(int u,int v) { E[u].push_back(Edge(v)); } int n,m,k=0; int cnt = 0;//记录走过的边的个数 int route[MAXN]; bool been[MAXN][MAXN]; bool f = false; void print() { for(int i=0;i<k;i++) { if(i) cout<<‘ ‘; cout<<route[i]; } //cout<<endl; } void dfs(int i) { if(f) return ; if(cnt==m) { f = true; route[k++]= i; print(); return ; } if(!E[i].size()) return ; for(int j=0;j<E[i].size();j++) { int v=E[i][j].v; if(!been[i][v]) { route[k++] = i;//记录路径 been[i][v]=been[v][i]=true;//标记 cnt++;//走过数量+1 dfs(v); cnt--; been[i][v]=been[v][i]=false; k--; } } } int main() { int x,y; cin>>n>>m; for(int i=0;i<m;i++) { scanf("%d%d",&x,&y); addedge(x,y); addedge(y,x); } dfs(1); if(!f) cout<<-1<<endl; return 0; }
时间: 2024-11-07 16:40:45