今天状态不好,做欧拉路题目练手都很不顺利。
再贴一遍求欧拉回路的模板加深印象:
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,其他每个点入度都等于出度,或者每个点入度都等于出度。
关于求欧拉回路时后将边压栈的原因:
假设中间存在一个点,从它开始可以扩展出两条以上欧拉回路,而其中一条是连接着起点的。那么在无序状态下,我们不能保证最后访问连接起点的那条边,如果先压栈的话会导致答案错误,而后压栈的话,则可以保证是在完成了一个回路的条件之下,再加一条回路。即保证第一个压栈点一定是与起点相连的。