求欧拉回路的算法学习
在求解欧拉回路的问题中我们可以采用fleury算法。

然而在进行算法竞赛时,如果只是求欧拉回路我们可以采用DFS进行实现,需要注意的小细节时在输出边时需要在回溯阶段逆向输出因为遇到 1->2->3->2->1这种图会出现走死路情况
来看道例题:
UVA10054

#include <bits/stdc++.h>
using namespace std;
const int N = 55;
int g[N][N];
int d[N];
int n;
void euler(int u) {
for(int v = 1; v <= 50; ++v){
if(g[u][v]) {
g[u][v]--;
g[v][u]--;
euler(v);
printf("%d %d\n", v, u); //一定是逆序输出
}
}
}
int main () {
int T;
scanf("%d", &T);
for(int t = 1; t <= T; ++t) {
int u, v;
memset(g, 0, sizeof g);
memset(d, 0, sizeof d);
scanf("%d", &n);
for(int i = 1; i <= n; ++i){
scanf("%d%d", &u, &v);
d[u]++;
d[v]++;
g[u][v]++;
g[v][u]++;
}
printf("Case #%d\n", t);
bool is = 1;
for(int j = 1; j <= 50; ++j) {
if(d[j] % 2) {
is = 0;
break;
}
}
if(!is) {
// printf("some heads may be lost\n");
printf("some beads may be lost\n");
}
else {
for(int i = 1; i <= 50; ++i) {
euler(i);
}
}
if(t != T) {
printf("\n");
}
}
}
作者:LightAc
出处:https://www.cnblogs.com/lightac/
联系:
Email: dzz@stu.ouc.edu.cn
QQ: 1171613053
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号