浅谈欧拉图、半欧拉图(Eulerian graph、semi-Eulerian graph)

来源:互联网 发布:cad mac中文破解版 编辑:程序博客网 时间:2024/05/16 23:59

做了这么多题目,遇到要用欧拉图性质的不算多。但觉得还是有点用,有必要做点笔记。


先看看欧拉图和半欧拉图的定义:

欧拉回路:图G中经过每条边一次并且仅一次的回路称作欧拉回路

欧拉通路:图G中经过每条边一次并且仅一次的路径称作欧拉通路。


那么

欧拉图(Eulerian graph)指的就是存在欧拉回路的图。

半欧拉图(semi-Eulerian graph)指的是存在欧拉通路但不存在欧拉回路的图。



再来看看二者存在的条件:

1.无向图中:

    无向图G为欧拉图,当且仅当G为连通图且所有顶点的度为偶数。
  
  无向图G为半欧拉图,当且仅当G为连通图且除了两个顶点的度为奇数之外,其它所有顶点的度为偶数。

2.有向图中:

  有向图G为欧拉图,当且仅当G为连通图,且所有顶点的入度等于出度。
  
  有向图G为半欧拉图,当且仅当G为连通图且存在顶点u的入度比出度大1,v的入度比出度小1,其它所有顶点的入度等于出度。



最后来看一道例题:

来自Codeforces Round #215 (Div. 1)的C题 Sereja and the Arrangement of Numbers


题意看这里:http://blog.csdn.net/gzh1992n/article/details/16976379


这题如何求解?

      显然我们二分要使用多少种数字(假设x个),然后取前x大的花费累加起来就是答案。

      但是现在有一个问题,我们要知道x种数字构造出符合要求的序列最短长度是多少。如果最短长度小于等于要求的长度,那么我们取前x大的就是可行的。


如何求最短长度?这就用到欧拉图的性质了。


      我们可以把给定的m个数看成点,对于序列中的a[i]a[i+1],看成一条有向边,从a[i]这个点指向a[i+1]。我们需要加入这样的边尽可能少,然后构成一张存在欧拉通路或者回路。这样就能从一个点出来,遍历完所有边一次,再到某个点结束,连起来的路径就是我们要的那个序列。

      如果我们有x个数字,那么至少要连x*(x-1)/2条有向边,一共会有x*(x-1)/2出度和入度。当然你可以让某个点都指向其余点,但这样这个点的入度!=出度,就不是欧拉图了。所以我们要调整x*(x-1)/2条有向边的方向,使得符合要求。

      比如4个点,可以1->2,1->3,1->4这样连接,1的出度是3。我们可以把1->4改为4->1来降低1的出入度,同时1和4还是连着的,这样序列中依然存在a[i]=4,a[i+1]=1。

      假如x为奇数,那么(x*(x-1)/2)/x=(x-1)/2刚好能被整除,那么所有点的入度都等于出度,直接是欧拉图了,存在欧拉回路。

   对于偶数,(x-1)/2不能被整除,那需要加上x/2条边才能被整除。但是我们要求的是添加最少边,我们可以少加一条,这样就会存在两个点u,v。u的出度比入度多1,v的入度比出度多1。这样就构造出了半欧拉图,存在欧拉通路。

     最后注意下,边数+1才是构造出的序列长度。代码在上面的链接中有。



后续有遇到用到欧拉图性质的好题会继续放上来更新,原来有遇到过忘了是哪里的了,欢迎推荐。

 
  

0 0
原创粉丝点击