1. 程式人生 > >SDUT2138圖結構練習——BFSDFS——判斷可達性

SDUT2138圖結構練習——BFSDFS——判斷可達性

圖結構練習——BFSDFS——判斷可達性

Time Limit: 1000MS Memory limit: 65536K

題目描述

 在古老的魔獸傳說中,有兩個軍團,一個叫天災,一個叫近衛。在他們所在的地域,有n個隘口,編號為1..n,某些隘口之間是有通道連線的。其中近衛軍團在1號隘口,天災軍團在n號隘口。某一天,天災軍團的領袖巫妖王決定派兵攻打近衛軍團,天災軍團的部隊如此龐大,甚至可以填江過河。但是巫妖王不想付出不必要的代價,他想知道在不修建任何通道的前提下,部隊是否可以通過隘口及其相關通道到達近衛軍團展開攻擊。由於n的值比較大(n<=1000),於是巫妖王找到了擅長程式設計的你 =_=,請你幫他解決這個問題,否則就把你吃掉變成他的魔法。為了拯救自己,趕緊想辦法吧。

輸入

 輸入包含多組,每組格式如下。 第一行包含兩個整數n,m(分別代表n個隘口,這些隘口之間有m個通道)。 下面m行每行包含兩個整數a,b;表示從a出發有一條通道到達b隘口(注意:通道是單向的)。

輸出

 如果天災軍團可以不修建任何通道就到達1號隘口,那麼輸出YES,否則輸出NO。

示例輸入

2 1
1 2
2 1
2 1

示例輸出

NO
YES

 #include <bits/stdc++.h>
 using namespace std;
 int Map[1001][1001];
 int vis[1001];
 int Now[1001];
 int n,m;
 int BFS(int k)
 {
     memset(vis,0,sizeof(vis));
     memset(Now,0,sizeof(Now));

     int ss,ee,flag=0;
     ss=ee=0;
     Now[ss++]=k;
     vis[k]=1;
     while(ss>ee)
     {
         int now=Now[ee++];
         for(int i=n;i>=1;i--)
         {
             if(Map[now][i]==1&&vis[i]==0)
             {
                 Now[ss++]=i;
                 vis[i]=1;
                 if(i==1)
                 {
                     flag=1;
                     break;
                 }
                 else
                    flag=0;
             }
         }
         if(flag==1)
            break;
     }
     if(flag==1)
        printf("YES\n");
     else
        printf("NO\n");
 }
 int main()
 {
     int u,v;

     while(~scanf("%d %d",&n,&m))
     {
         memset(Map,0,sizeof(Map));
         for(int i=0;i<m;i++)
         {
             scanf("%d %d",&u,&v);
             Map[u][v]=1;
         }
         BFS(n);
     }
 }