CSES Chess Tournament 題解與證明
演算法
不斷選取目前度數最大的點 ,假設度數為 ,與除了 以外度數前 大的人建邊,並繼續做下去直到所有人的度數都為 ,代表可以成功建圖。若演算法執行過程中發現有某個 無法和度數前 大的人建邊(例如:剩下的人不夠多),代表這不是合法的度序列。
正確性證明
假設 是一個非嚴格遞減的序列, 是一個度序列。
對 來說可以對應到一個圖 有點集 ,但我們尚不知道 與其他點的相鄰情況,假設目前有兩種情況:
Case 1
與 相鄰。此時將 刪去 的新圖度序列就是 。若 可以構成簡單圖,則 顯然也能構成簡單圖。
Case 2
至少與 其中一個點相連,這代表存在一個 使得 與 不相鄰。根據前提我們可知 ,我們再分兩個情況討論:
Case 2-1
。我們可以將 與 交換,這樣不會使得 改變。
Case 2-2
。這代表存在一個點 使得 與 相鄰,但 與 不相鄰。這樣我們可以把邊 、 刪除,加上邊 、,這樣不會使得 改變。
由上可知 只要與任何一個非 的點相鄰,則我們總有一個交換的方法使得讓 多和 其中一點相鄰,會到 Case 1。最終, 是否為合法度序列就由 決定,可以遞迴下去地做。