1. 程式人生 > 實用技巧 >[luogu p6857] 夢中夢與不再有夢

[luogu p6857] 夢中夢與不再有夢

傳送門

ps: 今天開始我要換題解佈局了,不再有原題內容,不再有評測記錄,而是加入了“一句話題意(Conclusion)”和“附言(More)”。附言是用來寫一些感想和從這道題獲得的經驗之類的。

\(\mathtt{Conclusion}\)

給定一個無向完全圖,求它的最大半尤拉子圖。

\(\mathtt{Solution}\)

首先我們要明白一個事,一個點數為 \(n\) 的無向完全圖中,每一個點都會有 \(n - 1\) 條邊。而這個無向完全圖的總邊數就是 \(\dfrac{n(n-1)}{2}\)

分情況討論:

如果這個無向完全圖的點數 \(n\) 滿足 \(n \nmid 2\)

,那麼每一個點就會向外連 \(n - 1\) 條邊。我們都知道,奇數-1會得到偶數,因此這張圖中每一個點都是偶點。整張圖就是一個尤拉圖

因此若一張無向完全圖的點數 \(n\) 滿足 \(n \nmid 2\),它的最大半尤拉子圖就是它自己。邊數就是整張圖的邊數,\(\dfrac{n(n-1)}{2}\)

如果這個無向完全圖的點數 \(n\) 滿足 \(n \mid 2\),同理會得到每個點都是奇點。

似乎處理最大半尤拉子圖有點棘手,不如我們逆向思維,考慮最少刪多少條邊能讓這張圖變成一張半尤拉圖
眾所周知,刪一條邊能讓兩個點的度減1.

把一張圖變成半尤拉圖,那麼我們最多隻能剩下兩個奇點。如果剩下的 \(n - 2\)

個奇點能夠通過刪一條邊,減去一個度變成偶點,那麼就變成半尤拉圖了!

然而你會發現,\(n\) 是一個偶數,\(n - 2\) 也是偶數!!

而且完全圖,哪一條邊都是應有盡有的!!

那麼!

重點來了,我們只需要刪除 \(\dfrac{n - 2}{2}\) 條沒有公共頂點的邊,就可以達到只剩下兩個奇點的目的了

可以這麼理解:將剩下的 \(n - 2\) 個奇點兩兩配對,比如這幾個奇點編號分別是 \(1, 2, 3, 4, 5, 6\)

隨便兩兩配對(隨機怎麼配都行):

1 4
2 6
3 5

只需要把每一對中間的邊刪掉(在此例子中就是:\(1 - 4, 2 - 6, 3 - 5\) 這三條邊)刪掉,就可以讓 \(1, 2, 3, 4, 5 ,6\)

的度分別恰好 \(-1\)。原先他們都是奇點,減去1個度自然就變成偶點了!

可能有些小夥伴還是沒太明白。沒有關係,我舉一個例子:

這是一張 \(n=6\) 的無向完全圖。

首先我們隨便抽兩個幸運之點,作為最後保留的兩個奇點。隨便抽哈,比如 \(1, 4\) 吧。我們會保持這兩個點一直是奇點。

剩下的 \(2, 3, 5 ,6\) 就得乖乖被刪掉一個度了。

怎麼刪?隨便兩兩配對:

2 6
3 5

刪掉 \(2-6\)\(3-5\) 這兩條邊,便可讓 \(2, 3, 5, 6\) 這四個點的度全部乖乖 \(-1\)

那麼最後,\(1, 4\) 就是這張圖的唯二奇點,整張圖便會變為半尤拉圖。

最後的最後,我們就可以得到式子了:

\(f(n)\) 為答案,則:

\(f(n) = \begin{cases}\dfrac{n(n-1)}{2}&x \nmid 2\\\dfrac{n(n-1) - n + 2}{2}&x\mid2\end{cases}\)

\(\mathtt{Code}\)

/*
 * @Author: crab-in-the-northeast 
 * @Date: 2020-10-20 11:16:31 
 * @Last Modified by: crab-in-the-northeast
 * @Last Modified time: 2020-10-20 11:19:29
 */
#include <iostream>
#include <cstdio>

typedef long long ll;

int main() {
    int T;
    std :: scanf("%d", &T);
    while (T--) {
        ll n;
        std :: scanf("%lld", &n);
        if (n % 2 != 0)
            std :: printf("%lld\n", n * (n - 1) / 2);
        else
            std :: printf("%lld\n", (n * (n - 1) - n + 2) / 2);
    }
    return 0;
}

\(\mathtt{More}\)

本篇題解花費1個小時。如果你看懂了,或者覺得我寫的題解很不錯,請給個大拇指把!球球啦,嗷嗚~

然後,感興趣的讀者可以思考以下幾個問題:

  • 如果本題要求必須回到最開始的夢,才能完成休息,答案是?
  • 如果本題要求在能獲得最大休息值的情況中,有多少種做夢方式,答案是?

更有興趣的讀者也可以自己想一些更有趣的問題哦。

那麼本篇題解就至此結束啦~拜拜~~~~~