2391 - 欧拉路
有一个图,图中要么有两个奇点要么0奇点,如果是欧拉回路请从第一个点为起点开始遍历,如果有两个奇点,则以字典序大的为起点开始遍历,在遍历的过程中,字典序小的先遍历。
Input
第一行两个整数,n和e,表示有n个节点,e条边
Output
只有一行,为欧拉路或欧拉回路。
Examples
Input
5 5 1 2 2 3 3 4 4 5 5 1
Output
1 5 4 3 2 1
Solution C
#include<stdio.h> #include<string.h> int a[105][105]; int du[105]; int n,e,start,df; void init(); void dfs(int); int main() { init(); dfs(start); return 0; } void dfs(int x) { for(int i=1;i<=n;i++) { if(a[x][i]==1) { a[x][i]=a[i][x]=0; dfs(i); } } printf("%d ",x); } void init() { memset(a,0,sizeof(a)); memset(du,0,sizeof(du)); scanf("%d%d",&n,&e); int x,y; for(int i=1;i<=e;i++) { scanf("%d%d",&x,&y); a[x][y]=a[y][x]=1; du[x]++; du[y]++; } start=1; for(int i=1;i<=n;i++) if(du[i]%2==1) start=i; }
Solution C++
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int a[100][100];//邻接矩阵存储节点关系 int du[100];//记录每个节点的度数 int n,e,start; void init(); void dfs(int); int main() { //freopen("euler1.in","r",stdin); //freopen("euler1.out","w",stdout); init(); //cout<<"start="<<start<<endl; dfs(start); return 0; } void init() { memset(a,0,sizeof(a)); memset(du,0,sizeof(du)); cin>>n>>e; int x,y; for(int i=1;i<=e;i++) { cin>>x>>y; a[x][y]=a[y][x]=1;//无向图 du[x]++;//x节点度数++ du[y]++;//y节点度数++ } start=1;//遍历所有节点找到第一个奇点,没奇点则为1 for(int i=1;i<=n;i++) if(du[i]%2==1) { start=i; //break; } } void dfs(int x) { for(int i=1;i<=n;i++) { if(a[x][i]==1)//找到下一个邻接点 { a[x][i]=a[i][x]=0;//两条边均设为0,不会重复访问 dfs(i);//以邻接点开始遍历 } } cout<<x<<' ';//输出当前节点 }