view code
1void 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 ...