教學香腸系列……
給定一張所有點入度=出度的有向圖,求歐拉回路條數。
爲了避免出現重複,對於這個無向圖,我們先確定一條
找一個以
容易證明,這樣做的一個方案唯一對應一條歐拉回路。
證明:
=>:構造法,從1號節點出發,先走起始邊,每到一個點,優先走非樹邊,再走樹邊。對於非樹邊,按照指定的順序走,即,如果第一條邊沒走過,走第一條,否則走第二條,…,若所有非樹邊都走過,則走樹邊。由於所有點入度=出度,所以不會有無邊可走的情況,直到回到
顯然每條邊至多走一次,如何證明每條邊至少走了一次?
性質1:如果一個點有未走過的出邊,則這個點出發的樹邊一定未走過,因爲樹邊是最後走的
性質2:如果一個節點出發的樹邊未走過,則它父親節點出發的樹邊一定也未走過,因爲每個節點入度=出度
然後就好辦了,反證法,假設存在一條邊沒走過,那麼這條邊的樹邊一定也沒走過,進而這條邊父親的樹邊也沒走過……以此類推,
<=:反向就很簡單了,對於歐拉回路我們從
只需證明我們選定的這些樹邊不會成環即可。
由於
假如這些邊存在環,那麼從環上一個點出發,最後一次離開這個點走的是樹邊,那麼沿着樹邊走下去,最後仍然會回到這個點,而這個點的最後一條出邊已走過,因此歐拉回路終止於此節點。而此節點不是
這樣我們就將有向圖歐拉回路一一對應了上述方案,那麼方案數是多少?
對於每個生成的內向樹,
那麼以
最終答案爲
其中
順帶一提,由於有向圖的歐拉路徑條數恆定不隨根節點改變而改變,所以
代碼自然是沒有的啦。。你可曾見過老年選手打代碼?