hdoj1269 迷宮城堡 tarjan

2022-09-02 19:27:13 字數 1611 閱讀 7598

題目鏈結

problem description

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

input

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

output

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

sample input

3 3

1 2

2 3

3 1

3 3

1 2

2 3

3 2

0 0sample output

yes

no思路

此題主要是給出乙個圖,然後求強連通分量的個數,就是tarjan演算法的模板題.

code

#include 

#include

#include

#include

#include

using

namespace

std;

const

int max = 10000+5;

bool in[max]; //當前節點是否在棧中

int low[max]; //當前節點根節點被遍歷的時間點

int dfn[max]; //當前節點被遍歷的時間點

int stack[max];

int time; //time為訪問的時間

int n, m, top; //top為棧頂元素位置

int cnt; //用來記錄強連通分量的數目

vector

> v(max); //記錄邊

void tarjan(int a)

else

if(in[temp])

}v[a].clear(); //注意清空,不然測試第二組資料會出錯

if(low[a] == dfn[a])

while(j != a);

}}int main()

memset(in, false, sizeof(in));

memset(dfn, 0, sizeof(dfn));

time = 0;

top = 0;

cnt = 0;

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

}if(cnt == 1)

else

}return

0;}

HDU 1269 迷宮城堡

強連通分量,這題幾乎沒有除錯就ac了。第一次寫tarjan,真順利,其實可以再優化的,只要求出兩個以上的強連通分量就可以直接輸出no了,而不用再繼續算下去 include include include include include include include includeusing nam...

HDU 1269 迷宮城堡

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

hdu 1269 迷宮城堡

根據題意,容易看出,這道題就是要求判斷該圖是否強連通,即只有乙個強連通分量,這樣的話,我們直接對圖運用tarjan演算法,求出圖中強連通分量的個數,只有乙個強連通分量就說明該圖強連通,否則該圖不強連通。這道題算是tarjan 的模板題 include include include include ...