欧拉回路(佛罗莱算法)

原创 2016年08月28日 23:17:58

若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径。若该路径是一个圈,则称为欧拉(Euler)回路
具有欧拉回路的图称为欧拉图(简称E图)。具有欧拉路径但不具有欧拉回路的图称为半欧拉图。
以下判断基于此图的基图连通。
无向图存在欧拉回路的充要条件
一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。
有向图存在欧拉回路的充要条件
一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图。
混合图存在欧拉回路条件
要判断一个混合图G(V,E)(既有有向边又有无向边)是欧拉图,方法如下:
假设有一张图有向图G',在不论方向的情况下它与G同构。并且G'包含了G的所有有向边。那么如果存在一个图G'使得G'存在欧拉回路,那么G就存在欧拉回路。
求欧拉回路的思路:
循环的找到出发点。从某个节点开始,然后查出一个从这个出发回到这个点的环路径。这种方法不保证每个边都被遍历。如果有某个点的边没有被遍历就让这个点为起点,这条边为起始边,把它和当前的环衔接上。这样直至所有的边都被遍历。这样,整个图就被连接到一起了。
具体步骤:
1。如果此时与该点无相连的点,那么就加入路径中
2。如果该点有相连的点,那么就加入队列之中,遍历这些点,直到没有相连的点。
3。处理当前的点,删除走过的这条边,并在其相邻的点上进行同样的操作,并把删除的点加入到路径中去。
Fleury算法模板如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<limits.h>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<math.h>
#define maxn 1005
using namespace std;
int n,m;//n个顶点,m条边 
int path[maxn][maxn];
stack<int>t;
void dfs(int x)
{
	t.push(x);
	for(int i=1;i<=n;i++)
	{
		if(path[x][i])
		{
			path[x][i]=path[i][x]=0;//删除此边 
			dfs(i);
			break; 
		}
	}
}
void  Fleury(int x)
{
	t.push(x);
	while(!t.empty())
	{
		int b=0;
		for(int i=1;i<=n;i++)
		{
			if(path[t.top()][i])
			{
				b=1;
				break;
			}
		}
		if(!b)
		{
			printf("%d ",t.top());
			t.pop();
		}
		else
		{
			int y=t.top();
			t.pop();
			dfs(y);
		}
	}
	printf("\n");
 } 
int  main()
{
	int i,j,x,y;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		while(!t.empty())
		   t.pop();
		memset(path,0,sizeof(path));
		for(i=1;i<=m;i++)
		{
			scanf("%d%d",&x,&y);
			path[x][y]=path[y][x]=1;//无向图建边 
		}
		int num=0,start=1;
		for(i=1;i<=n;i++)
		{
			int degree=0;
			for(j=1;j<=n;j++)
			    if(path[i][j])
			        degree++;
			if(degree%2==1)
			{
				start=i;//如果存在奇数顶点,则从奇数顶点出发,否则从1出发 
			    num++;
			}
		 }
		if(num==0 || num==2)
		   Fleury(start);
		else
		    printf("No Euler Path\n"); 
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Fleury (弗罗莱) 算法通俗解释

Fleury (弗罗莱) 算法通俗解释 1.定义 2.举例说明 图2为连通图G,现利用Fleury算法求它的欧拉通路。(注意区分:欧拉通路、欧拉回路) 其中一种欧拉通路如下:4 5 8 7 6...

Fleury(佛罗莱)算法求欧拉回路的学习

欧拉回路:简单来说,就是经过图G的每条边一次且仅一次,回到出发点的路径就叫欧拉回路; 我就直接上模板了。。。。 View Code 1 #include 2 #include 3...

51NOD 1503 猪和回文

//https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1503#include using namespace std; c...

腾讯十二周年活动电话是多少

★腾 讯 备 案 电 话【0755<3303<7551】抽 奖 二 线【95013<2195<0586】活 动 热线★抽奖腾讯备案电话【0755↗3303-7551】抽 奖 二 线【0755↗3303...

腾讯公司十周年庆典活動是真的吗_____↙

腾讯公司 总 部 电 话《95013+2195+0586》抽奖电话《95013+2195+0586》活动热线《95013+2195+0586》非常6+1 电 话《95013+2195+0586》幸 运...

51nod 1503 猪和回文(双线DP)

1503 猪和回文 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 ...

博弈问题通解(SG函数)

 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=...

51Nod-1503-猪和回文

ACM模版描述题解万万没想到,这是CF div.2 E题,在51才放在了4级算法,这个时间真奇妙,某大牛说的有趣:难道是通货膨胀的厉害?很好地一道dp题,很无奈,我不会,是参考他人思路写的,很强势!!...
  • f_zyj
  • f_zyj
  • 2016-09-29 18:46
  • 458

2017广西南宁邀请赛总结

赛前        南宁,应该是去的最远的地方了吧,能在icpc前有个热身的机会还是很开心的,飞机定的时间有些尴尬,因为是第一次坐没有经验,所以我们就提前一天去了机场,下了飞机,天灰蒙蒙的,温度刚好...

51Nod - 1503 多线程dp + 背包思想优化

题意: 一只猪走进了一个森林。很凑巧的是,这个森林的形状是长方形的,有n行,m列组成。我们把这个长方形的行从上到下标记为1到n,列从左到右标记为1到m。处于第r行第c列的格子用(r,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)