hdu1269強連通分量入門題

2022-03-16 01:57:59 字數 1789 閱讀 7428

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

1 22 3

3 13 3

1 22 3

3 20 0

sample output

yes

no有乙個坑點,以前0,0結束都是用cin>>n>>m,n,m處理的,結果這次不行,非要用

n==0&&m==0break;才ac,害我wa了好多遍

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define pi acos(-1)

#define ll long long

#define mod 1000000007

using

namespace

std;

const

int n=10005,maxn=100005,inf=0x3f3f3f3f

;int n,m;//

判斷是不是在棧中,2為在棧中,1為已訪問不在棧中,0為不在棧中

stacks;

vector

v[n],ans[n];

intdfn[n],low[n];

intinans[n],ins[n];

intnum,index;

void tarjan(int

u)

else

if(ins[t]==2)low[u]=min(low[u],dfn[t]);//

下乙個點在棧中了

}

if(low[u]==dfn[u])

}}int

main()

memset(dfn,

0,sizeof

(dfn));

memset(low,

0,sizeof

(low));

memset(ins,

0,sizeof

(ins));

memset(inans,

0,sizeof

(inans));

num=index=0

;

while(m--)

for(int i=1;i<=n;i++)

if(!dfn[i])

tarjan(i);

if(num>1)cout<<"no"

yes"

<}

return0;

}/*3 31 2

2 33 1

3 31 2

2 33 2

0 0*/

hdu1269 強連通分量tarjan

problem description 為了訓練小希的方向感,gardon建立了一座大城堡,裡面有n個房間 n 10000 和m條通道 m 100000 每個通道都是單向的,就是說若稱某通道連通了a房間和b房間,只說明可以通過這個通道由a房間到達b房間,但並不說明通過它可以由b房間到達a房間。gar...

HDU1269(強連通分量 Tarjan)

題目鏈結 題目大意 求給出的有向圖是否為乙個強聯通圖 解題思路 tarjan的入門題,對於tarjan的理解關鍵是low陣列與dfn陣列的理解,前乙個是當前搜尋樹的第一次掃瞄的tot值,也就是最早的時間戳,我們整個演算法就是為了更新它!而dfn是每個點被搜的時間節點,顯然,每個點的dfn都不同並且d...

強連通分量tarjan模板hdu1269迷宮城堡

第一次寫強連通tarjan同時也是自己在hdu100題的記錄 在有向圖中的強連通分量,核心是深搜,dfn陣列記錄搜尋順序,low陣列所能返回的最小的點 include include include includeusing namespace std vectorg 10003 int dfn 1...