HDU 1269(迷宮城堡)

2021-10-03 23:21:51 字數 1125 閱讀 6675

求有向圖是否為強連通圖,可以轉化為求有向圖強連通分量的數量,如果只有乙個強連通分量,則整個圖強連通。

使用 tarjan演算法,可參考部落格和百科,套用標準模板即可,詳細見注釋。

#include #include #include #include #include using namespace std;

const int maxn = 10005;

int n, m; //結點數,邊數

int num; //次序號

int total; //強連通分量的數量

bool instack[maxn]; //結點是否在棧內

int dfn[maxn]; //結點搜尋的次序號,即時間戳

int low[maxn]; //結點所在子樹的根的次序號

vectore[maxn]; //鄰接表,e[i]中儲存結點i直接指向的所有結點

stackst; //結點棧

//初始化

void init()

memset(instack, false, sizeof(instack));

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

memset(low, 0, sizeof(low));

num = 0;

total = 0;

while (!st.empty())

int u, v;

for (int i = 1; i <= m; i++) //輸入邊 }

//從結點u開始,搜尋強連通分量的數量

void tarjan(int u)

else if (instack[v]) //結點v還在棧內

low[u] = min(low[u], dfn[v]); //更新子樹根

} if (low[u] == dfn[u]) //結點u是強連通分量的根,將該子樹上所有結點出棧 }

}int main()

if (total == 1) //強連通分量數量為1,即整個圖為強連通

cout << "yes" << endl;

else

cout << "no" << endl;

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