HDU1269 迷宮城堡 tarjan演算法

2022-05-24 09:39:10 字數 1595 閱讀 9570

view code

1

void tarjan(int

x) 2 17

else

if(instack[i]) //

如果新搜尋到的節點已經被搜尋過而且現在在棧中

18 //

而前面節點已經在棧中,那麼後面的節點就可能和前面的節點在乙個聯通分量中

21}

2223

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

最終退回來的時候 low == dfn , 沒有節點能將根節點更新,那

24

34 cnt++;

35}

36}

3738

39void

solve()

40

58}

59}

6061 t1 = 0, t2 = 0

; 62

63for(i = 1; i < cnt; i++) 64

70if(cnt == 2

) 71 printf("

1\n0\n

");

72else

73 printf("

%d\n%d\n

", t1, max(t1, t2));

74}

75}

76

#include#includeusing namespace std;

#define max 10010 //題目中可能的最大點數

int stack[max],top=0; //tarjan 演算法中的棧

bool instack[max]; //檢查是否在棧中

int dfn[max]; //深度優先搜尋訪問次序

int low[max]; //能追溯到的最早的次序

int componentnumber=0; //有向圖強連通分量個數

int index=0; //索引號

vector edge[max]; //鄰接表表示

vector component[max]; //獲得強連通分量結果

int incomponent[max]; //記錄每個點在第幾號強連通分量裡

int componentdegree[max]; //記錄每個強連通分量的度

void tarjan(int i)

for(i=1; i<=m; i++)

solve(n);

if(componentnumber == 1)

cout<

else

cout<

} 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 ...