zoukankan      html  css  js  c++  java
  • SDUT 2139 数据结构实验之图论五:从起始点到目标点的最短步数(BFS)

     

    数据结构实验之图论五:从起始点到目标点的最短步数(BFS)

    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号隘口,那么输出最少经过多少通道,否则输出NO。

    Sample Input

    2 1
    1 2
    2 1
    2 1

    Sample Output

    NO
    1

    提示:本题考察的还是BFS,但是要注意的是这是个有向图,所以用矩阵存储结点的时候不能按无向图一样设置,还要注意可以建立一个结构体,用队列存储起来输出。

    代码实现如下(g++):
    # include <stdio.h>
    # include <string.h>
    # include <queue>
    
    using namespace std;
    
    int Map[1010][1010],v[1010],n,flag=0;
    
    struct node
    {
        int data;
        int step;
    } p,q;
    
    void BFS(node p)
    {
        queue<node>t;
        t.push(p);
        while(!t.empty())
        {
            q=t.front();
            t.pop();
            if(q.data==1)
            {
                flag=1;
                return ;
            }
            for(int i=0;i<=n;i++)
            {
                if(Map[q.data][i]==1&&v[i]!=1)
                {
                    v[i]=1;
                    p.data=i;
                    p.step=q.step+1;
                    t.push(p);
                }
            }
        }
    }
    
    int main()
    {
        int m,a,b;
        while(~scanf("%d %d",&n,&m))
        {
            flag=0;
            memset(Map,0,sizeof(Map));
            memset(v,0,sizeof(v));
            while(m--)
            {
                scanf("%d %d",&a,&b);
                Map[a][b]=1;
            }
            v[n]=1;
            p.data=n;
            p.step=0;
            BFS(p);
            if(flag)
            {
                printf("%d
    ",q.step);
            }
            else
                printf("NO
    ");
        }
        return 0;
    }
    
    
    /***************************************************
    Result: Accepted
    Take time: 60ms
    Take Memory: 2116KB
    ****************************************************/
  • 相关阅读:
    JavaScript 事件绑定:立即执行函数的闭包 vs let的块作用域
    JavaScript 中的组合继承 :ES5 与 ES6 中最近似的写法
    js 变量提升与函数提升
    js 函数
    清华大学孙茂松组:图神经网络必读论文列表
    idea里处理can not find declaration to go
    MySQL数据库里查询表注释、表字段注释信息
    MySQL循环游标的使用
    ELT和INTERVAL函数
    .jar文件执行命令
  • 原文地址:https://www.cnblogs.com/jkxsz2333/p/9505725.html
Copyright © 2011-2022 走看看