題目大意:有一些攝像頭,監視著一些位置,每個攝像頭有自己的位置,如果這個攝像頭的位置被其他攝像頭監視著,那麼它就不能被拆除,拆除乙個攝像頭之後就不能監視它原來監視的位置,問可否拆完全部攝像頭。
這道題做法很多,這裡提供兩種做法,一種是普遍使用的做法,一種是我自己的做法(我的做法。。可能比較煩,但思路類似,請放心食用!)
做法1:
對於這道題,很容易可以想到,若攝像頭a監視著攝像頭b,那麼a就向b連一條邊,每一次只能拆除入度為0的點,也就是沒有被監視著的攝像頭,那麼也就是拓撲排序,如果這個圖有拓撲排序,那麼一定可以拆完所有攝像頭,如果沒有,則輸出最後剩下幾個攝像頭即可,這種大家普遍使用的做法這裡就不細講了,這題拓撲做法的題解很多,很容易找,時間複雜度為o(n+e)。
做法2:
這樣做可能有點大材小用。。但是不要緊!條條道路通羅馬嘛。
圖就按上面的那樣建,建完之後,我們首先考慮,什麼樣的攝像頭拆不了?容易想到,在環裡面的攝像頭是拆不了的,因為你無法從裡面任何乙個攝像頭入手,換個說法,在環裡面每個點是可以走出去然後再走回來的,那麼這就等價於環裡面的每個攝像頭都監視著自己,所以拆不了,那麼就可以想到用強聯通來搞,把圖裡面的全部強聯通分量進行縮點,然後考慮縮點後的圖,從每個入度為0的點出發,如果這個點不是乙個環(這個點是乙個環指的是它是自環或者它是縮成的點),那麼ans++,然後繼續遍歷它連著的點即可,時間複雜度為o(n+e+n)。
**如下:
#include #include int n,len=0,lenn=0;
struct node;//鄰接表
node e[10010],ee[10010];
int first[110];
int a[510],shuru[100010],t=0;
bool huan[110];
void buildroad(int x,int y)
int ans,dfn[110],low[110],tot=0,zhan[110],belong[110],cnt=0,size[110];
bool v[110];
int minn(int x,int y){return x往下看有福利
其實之前我用乙個wa的**ac了這題,上面那個是改過的,詳情請見這裡
洛谷 P2712 攝像頭
食品店裡有n個攝像頭,這種攝像頭很笨拙,只能拍攝到固定位置。現有一群膽大妄為的松鼠想要搶劫食品店,為了不讓攝像頭拍下他們犯罪的證據,他們搶劫前的第一件事就是砸毀這些攝像頭。為了便於砸毀攝像頭,松鼠歹徒們把所有攝像頭和攝像頭能監視到的地方統一編號,乙個攝像頭能被砸毀的條件是該攝像頭所在位置不被其他攝像...
洛谷 P2712 攝像頭
食品店裡有n個攝像頭,這種攝像頭很笨拙,只能拍攝到固定位置。現有一群膽大妄為的松鼠想要搶劫食品店,為了不讓攝像頭拍下他們犯罪的證據,他們搶劫前的第一件事就是砸毀這些攝像頭。為了便於砸毀攝像頭,松鼠歹徒們把所有攝像頭和攝像頭能監視到的地方統一編號,乙個攝像頭能被砸毀的條件是該攝像頭所在位置不被其他攝像...
洛谷 P1101 題解
這道題可以用深搜 回溯 來寫,相信大部分人都是這麼想的,但是有些人可能在一些地方饒了半天,所以這裡就貼一下我的思路,個人覺得自己的很好懂,除了tx和ty那裡,但是tx和ty的那種用法對於輸出路徑的題目一般很實用 這個算是比較簡單的吧,題目裡給出了具體要找的字串,我們要做的就是對它進行8個方向的搜尋,...