求字典序最小欧拉路。

似乎不能用\(Fluery\)算法(\(O(E^2)\))。\(Fluery\)算法的思路是:延申的边尽可能不是除去已走过边的图的桥(割)。每走一步都要判断是否是割,应当会超时。

采用\(Hierholzer\)算法(\(O(V+E)\)),亦称逐步插入回路法。思路见代码。注意根据题意,每次选取未走过顶点最小的边延申。

注意题目要求从1号节点出发。

欧拉路存在的条件:

无向图:

存在欧拉回路的条件:原图连通,每个节点均为偶度节点。

存在欧拉通路的条件:存在欧拉回路,或原图连通,有两个节点为奇度节点,其他节点均为偶度节点。

有向图:

存在欧拉回路的条件:基图(有向边变成无向边)连通,每个节点的入度等于出度。

存在欧拉通路的条件:存在欧拉回路,或基图连通,有一个节点入度等于出度+1,有一个节点出度等于入度+1,其他节点入度等于出度。

#include<bits/stdc++.h>
const int maxn = 10000;
const int maxm = 100000; using namespace std; int to[maxm * 2 + 10];
int vis[maxm * 2 + 10];
int nex[maxm * 2 + 10];
int head[maxn + 10], cnt = 0; void addEdge(int a, int b)
{
to[cnt] = b;
vis[cnt] = 0;
nex[cnt] = head[a];
head[a] = cnt++;
to[cnt] = a;
vis[cnt] = 0;
nex[cnt] = head[b];
head[b] = cnt++;
} int degree[maxn + 10]; int vis1[maxn + 10], num = 0; void dfs(int x)
{
vis1[x] = 1;
num++;
for (int i = head[x]; i != -1; i = nex[i])
{
int l = to[i];
if (!vis1[l])
dfs(l);
}
} int main()
{
int n, m;
scanf("%d%d", &n, &m); memset(head, -1, sizeof(head));
memset(degree, 0, sizeof(degree));
for (int i = 1, a, b; i <= m; i++)
{
scanf("%d%d", &a, &b);
addEdge(a, b);
degree[a]++;
degree[b]++;
} memset(vis1, 0, sizeof(vis1));
dfs(1); int odd = 0;
for (int i = 1; i <= n; i++)
{
if (degree[i] % 2)
odd++;
} if (num == n && (odd == 0 || (odd == 2 && degree[1] % 2)))
{
stack<int> s1, s2;
s1.push(1);
while (!s1.empty())
{
int x = s1.top();
int y = -1, ii = -1;
for (int i = head[x]; i != -1; i = nex[i])
{
if (vis[i])
continue;
int l = to[i];
if (y == -1 || y > l)
y = l, ii = i;
}
if (y == -1)
{
s2.push(x);
s1.pop();
}
else
{
vis[ii] = vis[ii ^ 1] = 1;
s1.push(y);
}
}
bool first = true;
while (!s2.empty())
{
if (first)
{
printf("%d", s2.top());
s2.pop();
first = false;
}
else
{
printf(" %d", s2.top());
s2.pop();
}
}
printf("\n");
}
else
{
printf("-1\n");
} return 0;
}

最新文章

  1. div+css:div中图片垂直居中
  2. java.lang.NoSuchMethodError:
  3. 保证唯一的一种js提交数据方式,还不错
  4. python之面向对象编程
  5. yii2框架增删改查案例
  6. Web.config自定义节点configSections
  7. Objective -C学习笔记 之copy(复制)
  8. 【编程题目】一串首尾相连的珠子(m 个),有 N 种颜色(N&lt;=10),取出其中一段,要求包含所有 N 中颜色,并使长度最短。
  9. EF &ndash; 4.CRUD与事务
  10. ios 数据类型转换 UIImage转换为NSData NSData转换为NSString
  11. 免费馅饼 Why WA
  12. X61的intel wireless 3945abg 不再掉线了
  13. Javascript 基础知识笔记
  14. jquery 浏览器放大缩小函数resize
  15. Java中的局部变量表及使用jclasslib进行查看
  16. [bzoj2574] [Poi1999]Store-Keeper
  17. 详谈C++虚函数表那回事(多重继承关系)
  18. 简单的 FastDFS + Nginx 应用实例
  19. (4.3)mysql备份还原——mysql备份策略
  20. java利用Comparator接口对自定义数组排序

热门文章

  1. Java数组使用以及foreach循环
  2. linux进程管理常用命令
  3. Selenium+Java(六)Selenium 强制等待、显式等待、隐实等待
  4. kafka官方的kafka-server-start.sh不能关闭kafka进程解决办法
  5. Identityserver4中ResourceOwnerPassword 模式获取refreshtoken
  6. SpringMVC 前端传递list到后台
  7. python实现一可升降式的冒泡排序
  8. 程序员的算法课(16)-B+树在数据库索引中的作用
  9. CMSdede后台登陆界面设计
  10. 以面向对象的思维,搭建Android与多ble蓝牙设备并发通讯小框架