zoukankan      html  css  js  c++  java
  • 图练习-BFS-从起点到目标点的最短步数(sdut 2830)邻接边表

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2830

    题目描述

    在古老的魔兽传说中,有两个军团,一个叫天灾,一个叫近卫。在他们所在的地域,有n个隘口,编号 为1..n,某些隘口之间是有通道连接的。其中近卫军团在1号隘口,天灾军团在n号隘口。某一天,天灾军团的领袖巫妖王决定派兵攻打近卫军团,天灾军团的 部队如此庞大,甚至可以填江过河。但是巫妖王不想付出不必要的代价,他想知道在不修建任何通道的前提下,部队是否可以通过隘口及其相关通道到达近卫军团展 开攻击;如果可以的话,最少需要经过多少通道。由于n的值比较大(n<=100000),于是巫妖王找到了擅长编程的你 =_=,请你帮他解决这个问题,否则就把你吃掉变成他的魔法。为了拯救自己,赶紧想办法吧。

    输入

    输入包含多组,每组格式如下。
    第一行包含两个整数n(n <= 100000),m(m <= 200000)(分别代表n个隘口,这些隘口之间有m个通道)。
    下面m行每行包含两个整数a,b;表示从a出发有一条通道到达b隘口(注意:通道是双向的)。

    输出

    如果天灾军团可以不修建任何通道就到达1号隘口,那么输出最少经过多少通道,否则输出NO。

    示例输入

    2 1
    1 2
    2 1
    2 1

    示例输出

    1
    1

    提示

    这题之前一直没有做,对邻接边表有点恐惧,然后我和tjj来了一场比赛,我故意出了这个题,本来以为很难的题,没想到10几分钟就A了,发现要相信自己,很多题目很简单要敢于去做。

    建完表后就是很裸的bfs模板。

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define N 100001
    using namespace std;
    int n,m,tt;
    struct node
    {
        int x,y;
        int next;
    }q[1000001];
    struct node1
    {
        int x;
        int ans;
    }q1[1000001];
    int v[1000001];
    int head[100010];
    void init()
    {
        memset(head,-1,sizeof(head));
    }
    void add(int xx,int yy)
    {
        q[tt].x=xx;
        q[tt].y=yy;
        q[tt].next=head[xx];
        head[xx]=tt;
        tt++;
    }
    void bfs()
    {
        int e=0;
        int s=0;
        memset(v,0,sizeof(v));
        struct node1 t,f;
        t.x=1;
        t.ans=0;
        v[t.x]=1;
        q1[e++]=t;
        while(s<e)
        {
            t=q1[s++];
            if(t.x==n)
            {
                printf("%d
    ",t.ans);
                return ;
            }
            for(int i=head[t.x];i!=-1;i=q[i].next)
            {
                if(v[q[i].y]==0)
                {
                    v[q[i].y]=1;
                    f.ans=t.ans+1;
                    f.x=q[i].y;
                    q1[e++]=f;
                }
            }
        }
        printf("NO
    ");
    }
    int main()
    {
        int xx,yy;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            tt=0;
            init();
            while(m--)
            {
                scanf("%d%d",&xx,&yy);
                add(xx,yy);
                add(yy,xx);
            }
            bfs();
        }
    }
     
  • 相关阅读:
    USB HID Report Descriptor 报告描述符详解
    USB 管道 && 端点
    USB描述符解析-->枚举.
    USB HID介绍
    USB2.0速度识别
    spring core
    好妈妈【第三章】一生受用的品格教育,不止孩子需要,父母也需要。
    好妈妈【第二章】把学习做成轻松的事,父母如何提升孩子的学习成绩
    好妈妈【第一章】提高爱的质量,小学前的儿童教育
    Java日志系统
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/3924637.html
Copyright © 2011-2022 走看看