欧拉路

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了欧拉路相关的知识,希望对你有一定的参考价值。

欧拉路径和欧拉回路
欧拉路径:从某结点出发一笔画成所经过的路线叫做欧拉路径。
欧拉回路:在欧拉路径的基础上又回到起点。
a、凡是由偶点组成的连通图,一定可以一笔画成。画时可以把任一偶点为起点,最后一定能以这个点为 
终点画完此图。   
b、凡是只有两个奇点的连通图(其余都为偶点),一定可以一笔画成。画时必须把一个奇点为起点,另 
一个奇点终点。  
c、其他情况的图都不能一笔画出。(有偶数个奇点除以2便可算出此图需几笔画成。)

 

 

欧拉回路和欧拉路径的判断
欧拉回路:
无向图:每个顶点的度数都是偶数,则存在欧拉回路。
有向图:每个顶点的入度都等于出度,则存在欧拉回路。
欧拉路径:
无向图:当且仅当该图所有顶点的度数为偶数 或者 除了两个度数为奇数外其余的全是偶数。
有向图:当且仅当该图所有顶点 出度=入度 或者 一个顶点 出度=入度+1,另一个顶点 入度=出度+1,其 
他顶点 出度=入度。

 

怎么求一条欧拉路呐?

Fleury算法求欧拉路径

Fleury算法伪代码:

 

DFS(u):
	While (u存在未被删除的边e(u,v))
		删除边e(u,v)
		DFS(v)
	End
	PathSize ← PathSize + 1
	Path[ PathSize ] ← u

 看得更懂一点就是这个:

void dfs(int u) {
	int d;
	while((d = G[u].size()) > 0) {
		int v = G[u][0];
//		cout << v << " " << d << endl;
		G[u].erase(G[u].begin());
		int l = G[v].size();
		for(int i = 0; i < l; i ++) {	//找到与u相连的v的与u的连边,因为两边是相互的,要相互删除 (无向图)
			if(G[v][i] == u) {
				G[v].erase(G[v].begin() + i);
				break;
			}
		}
		dfs(v);
	}
	path[pathsize ++] = u;
}

或者是用 数组模拟临接矩阵:(删边的话 把G[u][v]=G[v][u]=-1 做个标记即可)
void dfs(int u) {
	int d = G[u].size();
	for(int i = 0; i < d; i ++) {
		int v = G[u][i];
		if(v != -1) {
			G[u][i] = -1;
			int l = G[v].size();
			for(int j = 0; j < l; j ++) {	//找到与u相连的v的与u的连边,因为两边是相互的,要相互删除
				if(G[v][j] == u) {
					G[v][j] = -1;
					break;
				}
			}
			dfs(v);
		}
	}
	path[pathsize ++] = u;
}

 至于正确性方面的问题。 我现在是没有明白的。待下次明白。 

以上是关于欧拉路的主要内容,如果未能解决你的问题,请参考以下文章

欧拉路和欧拉回路

欧拉路HDU3018

欧拉回路——欧拉路与欧拉回路

欧拉路,欧拉回路小结(转)

欧拉路问题

欧拉回路与欧拉路 之 一笔画问题