Time Limit: 3000MS | Memory Limit: 65536K | |||
Total Submissions: 6887 | Accepted: 3004 | Special Judge |
Description
Input
Output
Sample Input
4 5 1 2 1 4 2 3 2 4 3 4
Sample Output
1 2 3 4 2 1 4 3 2 4 1
Hint
题意:给出一个图,让你求欧拉回路,不过这题每条边可以走两遍,不过这两遍不能同方向。
思路:dfs,用vis数组来记录是否走过该点的状态。
在这里贴个求欧拉回路的模板:
int ans[maxn];///maxn是边的最大数量 bool vis[maxn]; int bj; void dfs(int now) { for(int i=head[now];i!=-1;i=tu[i].next) if(!vis[i]) { vis[i]=1; vis[i^1]=1;///这里是求欧拉回路,这一题用不着写这句,因为可以走双向 dfs(tu[i].to); ans[bj++]=i;///等于i是记录边,等于tu[i].to是记录点 } }
#include <iostream> #include <stdio.h> #include <stdlib.h> #include<string.h> #include<algorithm> #include<math.h> #include<queue> #include<iomanip> using namespace std; typedef long long ll; const int N=10005,maxn=50010; int head[N]; int ip; struct edgenode { int to; int next; } tu[N*N]; void init() { ip=0; memset(head,-1,sizeof(head)); } void add(int u,int v) { tu[ip].to=v,tu[ip].next=head[u],head[u]=ip++; } int ans[maxn]; bool vis[maxn]; int bj; void dfs(int now) { for(int i=head[now]; i!=-1; i=tu[i].next) if(!vis[i]) { vis[i]=1; //vis[i^1]=1; dfs(tu[i].to); ans[bj++]=tu[i].to; } } int main() { int m,n; scanf("%d%d",&n,&m); init(); while(m--) { int a,b; scanf("%d%d",&a,&b); add(a,b); add(b,a); } memset(vis,0,sizeof(vis)); memset(ans,0,sizeof(ans)); bj=0; dfs(1); for(int i=0; i<bj; i++) cout<<ans[i]<<endl; cout<<1<<endl; }