F - 三上図の実験データ構造:到達可能性

説明

ウォークラフトの古代の伝説では、自然災害と呼ばれる2つの軍団、近衛という名前の男があります。それらがされている領域では、nはパスがあり、番号1 ... nは、チャネル間のパスの一部が接続されています。前記センチネルパス番号1、番号nはパス災難。ある日、リッチキングスカージのリーダーは、センチネルを攻撃するために、このような大きな力のスカージを軍隊を送り、さらには川を渡って川を埋めることにしました。しかし、リッチキングは、不要なコストを支払うことをしたくなかった、彼は前提の下で知りたかった攻撃部隊にセンチネル峠に到着し、関連するチャネルを介して可能かどうか、任意のチャンネルを構築しません。そのため、比較的大きなnの値(N <= 1000)の、そしてリッチキングは良いプログラミングを見つけた= _ =あなた、あなたはそう、あなたが彼の魔法になって食べるよ、彼はこの問題を解決するのに役立ちます。自分自身を保存し、かつ迅速な方法でそれを考えるために。

入力

複数組、各フォーマットを含む入力。

最初の行は、(チャネルの間にMパスあり、nはパスを表す)、N、Mは2つの整数を含んでいます。

次のm行二つの整数、Bを含み、パス(注:チャネルは一方向性である)への通路を有し、Bからの逸脱を表します。
出力

スカージは、第1パスに到達するために、出力YES、それ以外の場合は出力NOを任意のチャネルを構築することができない場合。

サンプル

入力

2 1
1 2
2 1
2 1
出力

NO
YES

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<queue>
using namespace std;
int Map[1100][1100],vis[1100];
int n,m;
int flag;
void dfs(int t)
{
    vis[t] = 1;
    for(int i=n; i>=1; i--)
    {
        if(!vis[i]&&Map[t][i]==1)
        {
            if(i == 1)
            {
                flag = 1;
                return;
            }
            dfs(i);
        }

    }
}
int main()
{
    int t,p;
    int u,v;
    while(~scanf("%d %d",&n,&m))
    {
        memset(vis,0,sizeof(vis));
        memset(Map,0,sizeof(Map));
        flag = 0;
        for(int i=0; i<m; i++)
        {
            scanf("%d %d",&u,&v);
            Map[u][v] = 1;
        }
        dfs(n);
        if(flag) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

公開された177元の記事 ウォン称賛7 ビュー30000 +

おすすめ

転載: blog.csdn.net/Fusheng_Yizhao/article/details/104883452