題目描述
一年一度的假面舞會又開始了,棟棟也興致勃勃的參加了今年的舞會。
今年的面具都是主辦方特別定製的。每個參加舞會的人都可以在入場時選擇一 個自己喜歡的面具。每個面具都有乙個編號,主辦方會把此編號告訴拿該面具的人。為了使舞會更有神秘感,主辦方把面具分為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,...