迷宮城堡 tarjan演算法

2021-09-11 04:35:43 字數 1284 閱讀 3811

為了訓練小希的方向感,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"。 

題意很明顯 看看這個圖是不是每個點都能到每乙個點

即全連通

#include#include#include#include#include#define ll long long

using namespace std;

#define hengheng main()

#define mem(a,b) memset(a,b,sizeof(a))

const int maxx=1e5+10;

struct edgea[maxx];

int head[maxx];

int dfn[maxx]; // 時間戳

int low[maxx]; // 昨早到達的點

int scc[maxx]; // 屬於哪個連通

int top=0; // 堆疊 的頭

int sta[maxx]; // 堆疊陣列

int lay=0; // 順序

int cnt=0; // 鏈式前向星存圖的下標

int sig=0; // 連同編號;

void chushihua()// 初始化而已d

void addedge(int u,int v) // 存圖

void dfs(int u)

else if(scc[t]==0) // 它還沒有連通 。如果有的話也就無需繼續走了

}if(dfn[u]==low[u]) // 它自己這段就是連通了

} }

int hengheng

for(int i=1;i<=n;i++) // 因為走某乙個點可能走不完全部的圖

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

else printf("no\n"); }

}

迷宮城堡 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需要請你...

tarjan演算法 杭電迷宮城堡。

思路 這題運用到tarjan演算法 剛看這個演算法一臉蒙b,然後通過閱讀別人的部落格算是掌握的差不多了。這個演算法中用到兩個陣列第乙個dfn,low,第乙個陣列是用來記錄深搜的順序的,第二個陣列是用來儲存i節點能夠追溯到他這個強連通分量最先深搜到的那個節點。具體的看演算法有關鍵注釋。我這裡簡單說下這...