码迷,mamicode.com
首页 > 其他好文 > 详细

欧拉回路

时间:2015-06-20 09:20:52      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:

对于给定的图G,如果从某个结点出发走一条道路,使得它恰好通过G的每一条边恰好一次,该路径成为欧拉道路。如果该路径起点终点相同,那么成为欧拉回路(可见,欧拉回路是特殊的欧拉道路)。这也是一笔画问题。

不同的图,欧拉道路和回路的判断条件也不同,当然图都必须是连通图。如果是有向图,存在欧拉道路的条件是没有或者只有两个入度不等于出度的点,并且必须是一个点的出度比入度大一(欧拉道路的起点),一个点的入度比出度大一(欧拉道路的终点);如果所有的点入度等于出度,就是欧拉回路了。 而对于无向图,存在欧拉道路的条件是没有或者只有两个奇点,并且必须从一个奇点出发,另一个奇点结束;如果所有点度数均为偶数,则为欧拉回路。

当确定之后,需要打印出欧拉道路,可利用dfs搜索将走过的边压栈。

//适用于无向图
void euler(int u)
{
    for(int v=1; v<=n; v++)
    {
        if(G[u][v])
        {
            G[u][v]--;
            G[v][u]--;//如果是有向图,该句去掉
            euler(v);
            //压栈
            Edge tmp;
            tmp.u = u;
            tmp.v = v;
            Stack.push(tmp);
        }
    }
}

 

欧拉回路

标签:

原文地址:http://blog.csdn.net/tingyu1995/article/details/46563905

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!