今天状态不好,做欧拉路题目练手都很不顺利。

再贴一遍求欧拉回路的模板加深印象:

void Eular(int i);
{
	for (p,p<=code[i][0],p++)
		{
			if (! v[edge[i][p]])
				{
					v[edge[i][p]]=true;
					Eular(code[i][p]);
					stack[stack_size++]=edge[i][p];
				}
		}
}

 

具体的一些问题探讨:

1、无向图存在欧拉回路条件:每个点入度都为偶数

2、无向图存在欧拉路条件:只有两个点入度为奇数或每个点入度都为偶数

3、有向图存在欧拉回路条件:每个点入度都等于出度

4、有向图存在欧拉路条件:只存在这样两个点:一个点入度等于出度+1,另一个点入度=出度-1,其他每个点入度都等于出度,或者每个点入度都等于出度。

 

关于求欧拉回路时后将边压栈的原因:

假设中间存在一个点,从它开始可以扩展出两条以上欧拉回路,而其中一条是连接着起点的。那么在无序状态下,我们不能保证最后访问连接起点的那条边,如果先压栈的话会导致答案错误,而后压栈的话,则可以保证是在完成了一个回路的条件之下,再加一条回路。即保证第一个压栈点一定是与起点相连的。