有向图欧拉回路条数-BEST定理

来源:互联网 发布:python面试题 编辑:程序博客网 时间:2024/05/16 17:59

教学香肠系列……

给定一张所有点入度=出度的有向图,求欧拉回路条数。
n500

为了避免出现重复,对于这个无向图,我们先确定一条1号节点出发的起始边。

找一个以1号点为根的内向树(即每个点有唯一的一条路径到达1号点),对于一个点的所有不在树上、非起始边的出边,指定一个顺序。

容易证明,这样做的一个方案唯一对应一条欧拉回路。

证明:
=>:构造法,从1号节点出发,先走起始边,每到一个点,优先走非树边,再走树边。对于非树边,按照指定的顺序走,即,如果第一条边没走过,走第一条,否则走第二条,…,若所有非树边都走过,则走树边。由于所有点入度=出度,所以不会有无边可走的情况,直到回到1号节点且无边可走为止。
显然每条边至多走一次,如何证明每条边至少走了一次?
性质1:如果一个点有未走过的出边,则这个点出发的树边一定未走过,因为树边是最后走的
性质2:如果一个节点出发的树边未走过,则它父亲节点出发的树边一定也未走过,因为每个节点入度=出度
然后就好办了,反证法,假设存在一条边没走过,那么这条边的树边一定也没走过,进而这条边父亲的树边也没走过……以此类推,1号节点有至少一条入边没有走过,那么由于入度=出度,1号节点也有至少一条出边未走过,这与终止条件矛盾,证毕。

<=:反向就很简单了,对于欧拉回路我们从1号节点出发先走起始边,然后对于每个点的所有出边,最后一条是树边,其余按照遍历顺序确定顺序即可得到一个上述方案。(1号节点不选树边,起始边确定,将其余出边确定顺序就行了)
只需证明我们选定的这些树边不会成环即可。
由于1号节点不选择树边,因此环上一定不存在1号节点。
假如这些边存在环,那么从环上一个点出发,最后一次离开这个点走的是树边,那么沿着树边走下去,最后仍然会回到这个点,而这个点的最后一条出边已走过,因此欧拉回路终止于此节点。而此节点不是1号节点,矛盾。

这样我们就将有向图欧拉回路一一对应了上述方案,那么方案数是多少?

对于每个生成的内向树,1号节点起始边固定,其余边指定顺序,方案数为(d11)!;其余节点有一条树边,其余边指定顺序,方案数为(di1)!,总方案数为i=1n(di1)!。这里di表示点i的出度。

那么以1为根的内向树有多少个呢?矩阵树定理,O(n3)求出。

最终答案为T1(G)i=1n(di1)!
其中T1(G)=(出度矩阵-邻接矩阵)$去掉第一行第一列后行列式的值。

顺带一提,由于有向图的欧拉路径条数恒定不随根节点改变而改变,所以T1(G)还可以换成T2(G),T3(G),...。这样我们就证明了对于欧拉图来说,T1(G)=T2(G)=...=Tn(G)。我还没想好怎么用其他方法证明这个结论……

代码自然是没有的啦。。你可曾见过老年选手打代码?

原创粉丝点击