1. 程式人生 > >SDUT-2138_判斷可達性

SDUT-2138_判斷可達性

資料結構實驗之圖論三:判斷可達性
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;
}