图论算法小结:欧拉回路

欧拉回路

欧拉回路是指在一个图G中,从起点s出发,不重复地经过所有边后又返回到起点s的一条路径。同样还有关于欧拉道路的定义,不过起点和终点不一定重合,但都是不重复地经过图中的每一条边。

判断一个图中是否存在欧拉回路(道路)通过以下条件来判断:

(1)如果图G是一个无向图,那么度数为奇数的点不能超过两个,且这两个点其中一个作为起点,另一个作为终点。如果度数均为偶数,那么所有点均可以作为起点或终点。

(2)如果图G是一个无向图,那么度数为奇数的点不能超过两个,且这两个点中入度比出度小1的点必须作为起点,另一个入度比出度大1的点必须作为终点。如果度数均为偶数,那么所有点均可以作为起点或终点。

寻找欧拉回路实际上利用的还是DFS,只不过要求了不重复经过每一条边,因此需要设置一个标记数组,标记哪些边已经被使用过,每次只能通过未使用的边来拓展新的结点。

下面的代码给出了用邻接表实现的寻找欧拉回路的方法,最终欧拉回路被放入数组中,起点在数组尾部,终点在数组头部。

#define N 1000
typedef pair<int, int>P;
queue<P>q[N];//图的邻接表存储,first表示结点编号,second表示路径编号
struct Edge
{
	int from, to;
}path[N];//欧拉回路
int vis[N];//标记路径序号
int top, E;//top是path数组的个数,E是边数,初始设置为0
void addedge(int u, int v)
{
	q[u].push(P(v, ++E));
	q[
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值