題目描述
hf市地下有乙份寶藏,數不清的**、鑽石……。令人遺憾的是,千年來未曾有人得到過這份寶藏。其中乙個主要原因就是,要得到這份寶藏之前,首先需要通過乙個迷宮。
這個迷宮的結構非常複雜,一共有n個秘密房間。廣為流傳的一種說法是,必須在1天之內將這n個房間的門全部開啟,才能找到迷宮的出口,否則就會葬身於其中。傳說中同時
指出,這些房間之間有著錯綜複雜的聯絡。對於每個房間而言,僅有一把能夠開啟這個房間的鑰匙,這把鑰匙可能位於這n個房間中的任意乙個。每當乙個房間被開啟後,就可
以得到房間裡面的鑰匙,並以開啟其他的房間。被世人稱為有史以來最天才的探險家小雪準備於近日進入迷宮探險。為了確保萬無一失,他攜帶了足量的新型炸彈,每枚炸彈可
以將乙個房間的門直接炸掉。由於炸彈的威力太大,可能破壞整個迷宮的結果,小雪準備用最少的炸彈開啟所有的房間,你能夠幫助小雪計算一下嗎?
輸入第一行包含乙個整數n(n<=1000000),表示迷宮中房間的數目。接下來的n行,每行包含乙個整數,表示能夠開啟第i個房間的鑰匙的位置。
輸出僅包含乙個整數,表示最少需要的炸彈的數目。
樣例輸入
4樣例輸出
2這一題就是並查集的直接應用,有鑰匙就可以直接進入,進入乙個房間i的鑰匙在j,先j後i,說明j是i的祖先,即使有回邊的情況,由於必須先進入乙個房間再取鑰匙,炸彈就把這個回邊炸沒了,最後只要統計多少個根結點即可。事實上建邊的順序不影響結果。
#define _crt_secure_no_warnings
#include#includeconst int n = 1000005;
int fa[n];
int n;
int find(int x)//返回x的祖先
int main()
for (int i = 1; i <= n; i++)
}int cnt = 0;
for (int i = 1; i <= n; i++)
printf("%d\n", cnt);
}
演算法提高 奪寶奇兵
題目描述 在一座山上,有很多很多珠寶,它們散落在山底通往山頂的每條道路上,不同道路上的珠寶的數目也各不相同.下圖為一張藏寶地圖 73 8 8 1 0 2 7 4 4 4 5 2 6 5 奪寶奇兵 從山下出發,到達山頂,如何選路才能得到最多的珠寶呢?在上圖所示例子中,按照5 7 8 3 7的順序,將得...
演算法提高 奪寶奇兵
題目描述 在一座山上,有很多很多珠寶,它們散落在山底通往山頂的每條道路上,不同道路上的珠寶的數目也各不相同.下圖為一張藏寶地圖 73 8 8 1 0 2 7 4 4 4 5 2 6 5 奪寶奇兵 從山下出發,到達山頂,如何選路才能得到最多的珠寶呢?在上圖所示例子中,按照5 7 8 3 7的順序,將得...
試題 演算法提高 奪寶奇兵
題目描述 在一座山上,有很多很多珠寶,它們散落在山底通往山頂的每條道路上,不同道路上的珠寶的數目也各不相同.下圖為一張藏寶地圖 73 8 8 1 0 2 7 4 4 4 5 2 6 5 奪寶奇兵 從山下出發,到達山頂,如何選路才能得到最多的珠寶呢?在上圖所示例子中,按照5 7 8 3 7的順序,將得...