一笔画问题
描述
如果一个图存在一笔画,则一笔画的路径叫做欧拉路,如果最后又回到起点,那这个路径叫做欧拉回路。
根据一笔画的两个定理,如果寻找欧拉回路,对任意一个点执行深度优先遍历;找欧拉路,则对一个奇点执行dfs,时间复杂度为O(m+n),m为边数,n是点数。
输入描述
第一行n,m,有n个点,m条边,以下m行描述每条边连接的两点。
输出描述
欧拉路或欧拉回路,输出一条路径即可。
用例输入 1
5 5 1 2 2 3 3 4 4 5 5 1
用例输出 1
1 5 4 3 2 1
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e3+10,inf = 0x3f3f3f3f; int g[N][N],d[N]; int n,m; int pre[N],k; void dfs(int x) { for(int i=1;i<=n;i++) { if(g[x][i]) //有边没走过 { g[x][i] = g[i][x] = 0; //删边 dfs(i); } } pre[++k] = x; //记录路径 } int main() { cin>>n>>m; for(int i=1;i<=m;i++) { int x,y;cin>>x>>y; g[x][y] = g[y][x] = 1; d[x]++;d[y]++; //记录每个点的度 } int st = 1; for(int i=1;i<=n;i++) { if(d[i]%2==1)st = i; //找奇点 } dfs(st); for(int i=1;i<=k;i++) { cout<<pre[i]; if(i!=k)cout<<" "; } return 0; }

浙公网安备 33010602011771号