P2403 [SDOI2010]所駝門王的寶藏
阿新 • • 發佈:2021-08-12
[SDOI2010]所駝門王的寶藏
題目描述
在寬廣的非洲荒漠中,生活著一群勤勞勇敢的羊駝家族。被族人恭稱為“先知”的Alpaca L. Sotomon是這個家族的領袖,外人也稱其為“所駝門王”。所駝門王畢生致力於維護家族的安定與和諧,他曾親自率軍粉碎河蟹帝國主義的野蠻侵略,為族人立下赫赫戰功。所駝門王一生財寶無數,但因其生性節儉低調,他將財寶埋藏在自己設計的地下宮殿裡,這也是今天Henry Curtis故事的起點。Henry是一個愛財如命的貪婪傢伙,而又非常聰明,他費盡心機謀劃了這次盜竊行動,破解重重機關後來到這座地下宮殿前。 整座宮殿呈矩陣狀,由R×C間矩形宮室組成,其中有N間宮室裡埋藏著寶藏,稱作藏寶宮室。宮殿裡外、相鄰宮室間都由堅硬的實體牆阻隔,由一間宮室到達另一間只能通過所駝門王獨創的移動方式——傳送門。所駝門王為這N間藏寶宮室每間都架設了一扇傳送門,沒有寶藏的宮室不設傳送門,所有的宮室傳送門分為三種:輸入輸出格式
輸入格式
輸入檔案sotomon.in第一行給出三個正整數N, R, C。 以下N行,每行給出一扇傳送門的資訊,包含三個正整數xi, yi, Ti,表示該傳送門設在位於第xi行第yi列的藏寶宮室,型別為Ti。Ti是一個1~3間的整數,1表示可以傳送到第xi行任意一列的“橫天門”,2表示可以傳送到任意一行第yi列的“縱寰門”,3表示可以傳送到周圍8格宮室的“任意門”。 保證1≤xi≤R,1≤yi≤C,所有的傳送門位置互不相同。輸出格式
輸出檔案sotomon.out只有一個正整數,表示你確定的路線所經過不同藏寶宮室的最大數目。輸入輸出樣例
輸入樣例 #1
10 7 7 2 2 1 2 4 2 1 7 2 2 7 3 4 2 2 4 4 1 6 7 3 7 7 1 7 5 2 5 2 1
輸出樣例 #1
9
說明
資料規模和約定:分析:各個房間之間的路經滿足有向關係,可以重複經過每一個房間多次,求最多經過的房間數目。可以想到縮點,在整張圖跑 tarjan 演算法縮點,重新連邊然後在DAG上跑拓撲排序或者記憶化搜尋。
但是如果我們暴力建邊的話時間複雜度和空間複雜度都是$O(n ^ {2} )$的,難以接受
所以本題的問題就是如何優化建邊
考慮到等效性原則,對於每一個向本列(本行)連邊的點,都有一條有向邊指向每一個本列(本行)的其他點。
可以新建一個虛擬原點$U$[U初始化會連線該行/列的每一個點],通過讓這個點向$U$連邊,達到等效的效果
1 ~ r :每一行的超級原點
r + 1 ~ r + c :每一列的超級原點
r + c + 1 ~ r + c + n :原始點
對於第三種點,我們可以預先用map存下每一個座標對應點的序號,對這種點加邊時直接列舉周圍8個點,查詢對應點的序號就行了
細節 :
-
r 和 c 直接取成 $max(a_i.x) 和 max(a_i.y)$ 多餘的捨去
-
統計強連通分量的大小時去掉虛擬點(u <= r + c)
-
map 記錄兩個強連通分量之間是否已經加過邊,判重
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map