HDU1269迷宮城堡(強連通分量)

2022-09-08 00:12:32 字數 1381 閱讀 9787

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 3

1 2

2 3

3 1

3 3

1 2

2 3

3 2

0 0sample output

yes

no注意:題目的資料可能有n個點,但沒有邊,一開始本zz在讀入時while中寫的判斷時(n&&m),結果wa了一下午,後來才想到有上面這種情況。。。orz

這裡寫**片

#include

#include

#include

#include //

using

namespace

std;

const

int n=100010;

int n,m;

struct node;

node way[n];

int st[n],tot,tt,cnt;

int dfn[n],low[n],sta[n],top;

int p[n];

void add(int u,int v)

void dfs(int x)

else

if (p[v]) //在棧裡

low[x]=min(low[x],dfn[v]); //

}if (dfn[x]==low[x])

while (j!=x);

}}int main()

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

if (!dfn[i]) //dfn是時間戳,可以通過ta來判斷是否遍歷過該點

dfs(i);

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

else

printf("no\n");

scanf("%d%d",&n,&m);

}return

0;}

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

迷宮城堡 HDU 1269 強連通分量

tarjan演算法 dfn為最先訪問的時間點 low為本節點通過他的兒子更新到的最小時間點 stack int s int vis n res vector int a n void dfs int x else if vis y 1 訪問過,但y在stack中 low x min low x lo...