迷宮城堡 Tarjan

2021-09-22 23:13:03 字數 2132 閱讀 5441

為了訓練小希的方向感,gardon建立了一座大城堡,裡面有n個房間(n<=10000)和m條通道(m<=100000),每個通道都是單向的,就是說若稱某通道連通了a房間和b房間,只說明可以通過這個通道由a房間到達b房間,但並不說明通過它可以由b房間到達a房間。gardon需要請你寫個程式確認一下是否任意兩個房間都是相互連通的,即:對於任意的i和j,至少存在一條路徑可以從房間i到房間j,也存在一條路徑可以從房間j到房間i。

輸入包含多組資料,輸入的第一行有兩個數:n和m,接下來的m行每行有兩個數a和b,表示了一條通道可以從a房間來到b房間。檔案最後以兩個0結束。

對於輸入的每組資料,如果任意兩個房間都是相互連線的,輸出」yes」,否則輸出」no」。

通過鏈式前向星遍歷節點

遍歷i能到的每乙個點j,如果dfn[j]=0,即未被訪問過,則對j進行dfs,然後low[i]=min(low[i],low[j])

如果j能到達的下乙個點i已經在sta中,則說明i~j屬於同乙個聯通分量,那麼low[j]=min(low[j],dfn[i]),在回溯的過程中,low[i~j]都會變成min(low[j]),這樣就能找到強聯通分量的根

如果dfn[i]==low[i],則說明i和他的子孫節點可構成乙個聯通分量,其子孫節點存放於sta中,將這些節點彈出並進行染色標記

最後,同乙個染色標記的所有節點為同乙個強聯通分量,可將他們看作乙個點,即縮點操作,這些強聯通分量間構成乙個有向無環圖。

時間複雜度o(n+m)

if(vis[ne]) low[x]=min(low[x],dfn[ne]); //找到環

}if(low[x]==dfn[x])

top--;//彈出x}}

intmain

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

if(!dfn[i]) tarjan(i);

if(colnum==1) printf("yes\n");

else

printf("no\n");

}return0;}

迷宮城堡 tarjan演算法

為了訓練小希的方向感,gardon建立了一座大城堡,裡面有n個房間 n 10000 和m條通道 m 100000 每個通道都是單向的,就是說若稱某通道連通了a房間和b房間,只說明可以通過這個通道由a房間到達b房間,但並不說明通過它可以由b房間到達a房間。gardon需要請你寫個程式確認一下是否任意兩...

迷宮城堡 Tarjan入門

傳送門 hdu 1269 為了訓練小希的方向感,gardon建立了一座大城堡,裡面有n個房間 n 10000 和m條通道 m 100000 每個通道都是單向的,就是說若稱某通道連通了a房間和b房間,只說明可以通過這個通道由a房間到達b房間,但並不說明通過它可以由b房間到達a房間。gardon需要請你...

HDU1269 迷宮城堡(Tarjan)

題目 我是超連結 題解 就是個模板題啊 按理說應該有兩種方法 1 kobalabala 從任意乙個點開始,如果可以遍歷到所有點,而且,反置邊之後依然可以遍歷到所有點那就是yes 否則就是no 但這個方法蜜汁不對?2 tarjan.include include include using names...