SDUT-2138_判斷可達性
阿新 • • 發佈:2018-11-25
資料結構實驗之圖論三:判斷可達性
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
在古老的魔獸傳說中,有兩個軍團,一個叫天災,一個叫近衛。在他們所在的地域,有n個隘口,編號為1..n,某些隘口之間是有通道連線的。其中近衛軍團在1號隘口,天災軍團在n號隘口。某一天,天災軍團的領袖巫妖王決定派兵攻打近衛軍團,天災軍團的部隊如此龐大,甚至可以填江過河。但是巫妖王不想付出不必要的代價,他想知道在不修建任何通道的前提下,部隊是否可以通過隘口及其相關通道到達近衛軍團展開攻擊。由於n的值比較大(n<=1000),於是巫妖王找到了擅長程式設計的你 =_=,請你幫他解決這個問題,否則就把你吃掉變成他的魔法。為了拯救自己,趕緊想辦法吧。
Input
輸入包含多組,每組格式如下。
第一行包含兩個整數n,m(分別代表n個隘口,這些隘口之間有m個通道)。
下面m行每行包含兩個整數a,b;表示從a出發有一條通道到達b隘口(注意:通道是單向的)。
Output
如果天災軍團可以不修建任何通道就到達1號隘口,那麼輸出YES,否則輸出NO。
Sample Input
2 1
1 2
2 1
2 1
Sample Output
NO
YES
#include <string.h> #include <stdio.h> #include <stdlib.h> #include <math.h> int s[1050][1050];/*利用鄰接矩陣來記錄圖*/ int n;/*n節點數量*/ int ff;/*標記是否可達*/ int f[105];/*記錄點是否被遍歷過*/ void DFS(int x) { int i; f[x] = 1; if(x==1)/*說明可以從n走到1*/ { ff = 1; return; } for(i=0;i<n;i++) { if(!f[i]&&s[x][i]) { f[x] = 1; DFS(i); } } } int main() { int m,i; int u,v; while(scanf("%d%d",&n,&m)!=EOF) { memset(s,0,sizeof(s)); for(i=0;i<m;i++) { scanf("%d%d",&u,&v); s[u][v] = 1; } memset(f,0,sizeof(f)); ff = 0; DFS(n); if(ff) printf("YES\n"); else printf("NO\n"); } return 0; }