教学香肠系列……
给定一张所有点入度=出度的有向图,求欧拉回路条数。
n≤500
为了避免出现重复,对于这个无向图,我们先确定一条 1 号节点出发的起始边。
找一个以
容易证明,这样做的一个方案唯一对应一条欧拉回路。
证明:
=>:构造法,从1号节点出发,先走起始边,每到一个点,优先走非树边,再走树边。对于非树边,按照指定的顺序走,即,如果第一条边没走过,走第一条,否则走第二条,…,若所有非树边都走过,则走树边。由于所有点入度=出度,所以不会有无边可走的情况,直到回到
显然每条边至多走一次,如何证明每条边至少走了一次?
性质1:如果一个点有未走过的出边,则这个点出发的树边一定未走过,因为树边是最后走的
性质2:如果一个节点出发的树边未走过,则它父亲节点出发的树边一定也未走过,因为每个节点入度=出度
然后就好办了,反证法,假设存在一条边没走过,那么这条边的树边一定也没走过,进而这条边父亲的树边也没走过……以此类推, 1 号节点有至少一条入边没有走过,那么由于入度=出度,
<=:反向就很简单了,对于欧拉回路我们从 1 号节点出发先走起始边,然后对于每个点的所有出边,最后一条是树边,其余按照遍历顺序确定顺序即可得到一个上述方案。(