假面舞會 題解

2022-06-26 08:21:11 字數 1764 閱讀 4855

題目描述

一年一度的假面舞會又開始了,棟棟也興致勃勃的參加了今年的舞會。

今年的面具都是主辦方特別定製的。每個參加舞會的人都可以在入場時選擇一 個自己喜歡的面具。每個面具都有乙個編號,主辦方會把此編號告訴拿該面具的人。為了使舞會更有神秘感,主辦方把面具分為k (k≥3)類,並使用特殊的技術將每個面具的編號標在了面具上,只有戴第i 類面具的人才能看到戴第i+1 類面具的人的編號,戴第k 類面具的人能看到戴第1 類面具的人的編號。 參加舞會的人並不知道有多少類面具,但是棟棟對此卻特別好奇,他想自己算出有多少類面具,於是他開始在人群中收集資訊。 棟棟收集的資訊都是戴第幾號面具的人看到了第幾號面具的編號。如戴第2號面具的人看到了第5 號面具的編號。棟棟自己也會看到一些編號,他也會根據自己的面具編號把資訊補充進去。由於並不是每個人都能記住自己所看到的全部編號,因此,棟棟收集的信 息不能保證其完整性。現在請你計算,按照棟棟目前得到的資訊,至多和至少有多少類面具。由於主辦方已經宣告了k≥3,所以你必須將這條資訊也考慮進去。

輸入格式

第一行包含兩個整數n, m,用乙個空格分隔,n 表示主辦方總共準備了多少個面具,m 表示棟棟收集了多少條資訊。

接下來m 行,每行為兩個用空格分開的整數a, b,表示戴第a 號面具的人看到了第b 號面具的編號。相同的數對a, b 在輸入檔案中可能出現多次。

輸出格式

包含兩個數,第乙個數為最大可能的面具類數,第二個數為最小可能的面具類數。

如果無法將所有的面具分為至少3 類,使得這些資訊都滿足,則認為棟棟收集的資訊有錯誤,輸出兩個-1。

樣例輸1

6 51 2

2 33 4

4 13 5

樣例輸出1

4 4樣例輸入2

3 31 2

2 12 3

樣例輸出2

-1 -1

資料範圍與提示

50%的資料,滿足n ≤ 300, m ≤ 1000;

100%的資料,滿足n ≤ 100000, m ≤ 1000000。

根據題目的意思:

如果有多個點指向同乙個點,那麼他們屬於同一類別。

同乙個點看到的所有點是乙個種類。

按照上面的結論,我們可以把同類別的所有的點縮成乙個點,這樣對於乙個連通塊(不一定是強聯通),就可以變成若干環和若干鏈的形式。

因此,最終的答案為:

為了找環和鏈,我們可以針對每個關係建立一條正向邊和反向邊,權值分別用1和-1來表示,從某一起點出發記錄到達任意一點的權值(路徑上的邊權和),根據權值來求解環的大小和鏈的長度,具體看**注釋

int main() 

// 先用dfs找環求解

memset(vis, 0, sizeof(vis));

for (int i = 1; i <= n; i++)

// 找環結束,根據得到的最大公約數判斷

if (ans)

return 0;

} // 找環失敗了,找鏈

memset(vis, 0, sizeof(vis));

for (int i = 1; i <= n; i++)

} if (ans >= 3) printf("%d %d\n", ans, 3);

else printf("-1 -1\n");

return 0;

}// 再來看看兩個dfs

// 第乙個處理環

void dfs(int now)

else }}

// 第二個處理鏈

void dfs(int now)

}}

1064 Noi2008 假面舞會

time limit 10 sec memory limit 162 mb submit 1960 solved 941 submit status discuss 一年一度的假面舞會又開始了,棟棟也興致勃勃的參加了今年的舞會。今年的面具都是主辦方特別定製的。每個參加舞會的人都可以在入場時選擇一 個...

BZOJ 1064 Noi2008 假面舞會

題目大意 n個人,k種假面,每人戴一種,戴第i種的可以看見第i 1種,戴第k種的可以看見第1種,給出m條關係表示乙個人可以看到另乙個人,問k可能的最大值和最小值。n 100,000,m 1,000,000 思路 染色,若點i顏色為ci,就把點i能到的點染成ci 1,能到點i的點染成ci 1,如果染之...

P4564 假面 題解

這個 ctsc 的題竟然是我自己想出來的,incredible portal 分為兩個問題 求每個結界技能每個攻擊物件被命中的概率,和求最終每個敵方單位的期望生命值。先考慮後者。顯然只有鎖定技能能夠造成傷害。我們設敵方單位 i 被命中的鎖定技能個數為 x 將式子列出來 mathrm e max 0,...