A)建图是巧妙,使用边表示每一个数字,那么就是走完每一个边一次再回到起点,便是求欧拉回路
B)建图是有向图,建图需要注意,同时,输出的时候逆序输出
C)path保存的是完整的路径,输出的时候只需&1即可
#include<bits/stdc++.h>
using namespace std;
#define cl(a,b) memset(a,b,sizeof(a))
#define LL long long
#define pb push_back
#define gcd __gcd
#define For(i,j,k) for(int i=(j);i<k;i++)
#define lowbit(i) (i&(-i))
#define _(x) printf("%d\n",x)
const int maxn = 1<<15+2;
const int inf = 1 << 28;
struct Edge {
int from,to;
};
vector<Edge> es;
vector<int> G[maxn];
void addEdge(int from,int to) {
es.pb((Edge) {
from,to
});
int m = es.size()-1;
G[from].pb(m);
//G[to].pb(m);//有向图建立
}
int n,m;
int path[maxn],top;
bool vis[maxn];
void dfs(int u) {
for(int i=0; i<G[u].size(); i++) {
int p = G[u][i];
if(vis[p])continue;
vis[p]=true;
int v = es[G[u][i]].to;
dfs(u==v?es[G[u][i]].from:v);
}
path[++top] = u;
}
int main() {
while(cin>>n) {
cl(vis,false);
for(int i=0;i<maxn;i++)G[i].clear();
es.clear();top=0;
int x = 1<<(n-1);
for(int i=0; i<(1<<n-1); i++) {
int j=i<<1;
int xx = 1<<(n-1);
j = j&(xx-1);
addEdge(i,j);
addEdge(i,j+1);
}
dfs(0);
for(int i=top-1;i>=1;i--){
printf("%d",path[i]&1);
}
printf("\n");
}
return 0;
}

本文介绍了一种基于有向图的欧拉回路求解算法,通过巧妙地构建图结构并利用深度优先搜索来寻找一条能遍历每条边恰好一次的回路。文章提供了完整的代码实现,并详细解释了建图过程及输出结果的方法。
&spm=1001.2101.3001.5002&articleId=52252031&d=1&t=3&u=5ed1f7d3da9241ce9908f57d55a9ff1c)
1万+

被折叠的 条评论
为什么被折叠?



