1341:【例题】一笔画问题 欧拉回路

it2023-04-03  73

【题目描述】 如果一个图存在一笔画,则一笔画的路径叫做欧拉路,如果最后又回到起点,那这个路径叫做欧拉回路。

根据一笔画的两个定理,如果寻找欧拉回路,对任意一个点执行深度优先遍历;找欧拉路,则对一个奇点执行dfs,时间复杂度为O(m+n),m为边数,n是点数。

【输入】 第一行n,m,有n个点,m条边,以下m行描述每条边连接的两点。

【输出】 欧拉路或欧拉回路,输出一条路径即可。

【输入样例】

5 5 1 2 2 3 3 4 4 5 5 1

【输出样例】

1 5 4 3 2 1 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<vector> #include<set> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 501 #define MOD 123 #define E 1e-6 using namespace std; int n,m; int g[N][N]; int dis[N],path[N*2]; int cnt; void dfs(int i) { for(int j=1;j<=n;j++) if(g[i][j]) { g[i][j]=0; g[j][i]=0; dfs(j); } path[cnt++]=i; } int main() { cin>>n>>m; for(int i=1;i<=m;i++) { int x,y; cin>>x>>y; g[x][y]=1; g[y][x]=1; dis[x]++; dis[y]++; } int start=1; for(int i=1;i<=n;i++) if(dis[i]%2) { start=i; } dfs(start); for(int i=cnt-1;i>=0;i--) cout<<path[i]<<" "; return 0; }
最新回复(0)