迷宮城堡 Tarjan入門

2021-09-25 21:23:24 字數 1588 閱讀 5868

傳送門:hdu-1269

為了訓練小希的方向感,gardon建立了一座大城堡,裡面有n個房間(n<=10000)和m條通道(m<=100000),每個通道都是單向的,就是說若稱某通道連通了a房間和b房間,只說明可以通過這個通道由a房間到達b房間,但並不說明通過它可以由b房間到達a房間。gardon需要請你寫個程式確認一下是否任意兩個房間都是相互連通的,即:對於任意的i和j,至少存在一條路徑可以從房間i到房間j,也存在一條路徑可以從房間j到房間i。

輸入包含多組資料,輸入的第一行有兩個數:n和m,接下來的m行每行有兩個數a和b,表示了一條通道可以從a房間來到b房間。檔案最後以兩個0結束。

對於輸入的每組資料,如果任意兩個房間都是相互連線的,輸出」yes」,否則輸出」no」。

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

4647

4849

5051

5253

5455

5657

5859

60

#include

using

namespace

std;

#define rep(i,a,n) for(int i=a;i

#define repd(i,a,n) for(int i=n-1;i>=a;i--)

#define crl(a,x) memset(a,x,sizeof(a))

const

int n=1e5+5;

int dfn[n],low[n],clock,begin[n],ans;bool instack[n];

struct

node; //鏈式向前星存圖

vector

edge;

stack

s;void

init

()void

tarjan

(int u)

else

if(instack[edge[i].to])

low[u]=min(low[u],dfn[edge[i].to]);

}if(dfn[u]==low[u])while(tem!=u);}}

intmain

());

begin[a]=edge.size()-1;

}rep(i,1,n+1)

if(!dfn[i]) tarjan(i); //tarjan

puts(ans==1? "yes":"no"); //聯通分支數是否為1

}return0;}

迷宮城堡 Tarjan

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

迷宮城堡 tarjan演算法

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

HDU1269 迷宮城堡(Tarjan)

題目 我是超連結 題解 就是個模板題啊 按理說應該有兩種方法 1 kobalabala 從任意乙個點開始,如果可以遍歷到所有點,而且,反置邊之後依然可以遍歷到所有點那就是yes 否則就是no 但這個方法蜜汁不對?2 tarjan.include include include using names...