迷宮城堡 最大強連通分量

2021-06-23 07:07:04 字數 1287 閱讀 9604

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 31 2

2 33 1

3 31 2

2 33 2

0 0sample output

yesno

#include#include#define n 10005

#define m 100005

struct edge

;edge edge[m];//邊的集合

int node[n];//頂點集合

int instack[n];//標記是否在stack中

int stack[n];

int belong[n];//各頂點屬於哪個強連通分量

int dfn[n];//節點u搜尋的序號(時間戳)

int low[n];//u或u的子樹能夠追溯到的最早的棧中節點的序號(時間戳)

int n, m;//n:點的個數;m:邊的條數

int cnt_edge;//邊的計數器

int index;//序號(時間戳)

int top;

int bcnt;//有多少個強連通分量

void init()

void add_edge(int u, int v)//鄰接表儲存

void tarjan(int u)

{ int i,j;

int v;

dfn[u]=low[u]=++index;

instack[u]=true;

stack[++top]=u;

for(i=node[u];i!=-1;i=edge[i].next)

{v=edge[i].v;

if (!dfn[v])//如果點v沒被訪問

{tarjan(v);

if (low[v]

強連通分量 迷宮城堡

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

HDU 1269 迷宮城堡 強連通分量

一道強連通分量的裸題,當只有乙個強連通分量的時候輸出yes,否則輸出no include include include include include include include include include include include using namespace std typed...

hdu 1269 迷宮城堡 強連通分量

problem 給乙個有向圖,問這個圖是否兩兩都可互相達。solution 求強連通分量,看一共有幾個強連通分量,如果只有乙個則兩兩可互相達。include include include include include include include include include include...