zoukankan      html  css  js  c++  java
  • 63.队列:1.    寻找经过结点最少的路径

    1.  寻找经过结点最少的路径

     

    【例14表示的是从城市A到城市H的交通图。从图中可以看出,从城市A城市H要经过若干个城市。现要找出一条经过城市最少的一条路线。
    【算法分析】
    看到这图很容易想到用邻接距阵来表示,0表示能走,1表示不能走。如图。
    63.队列:1. <wbr> <wbr> <wbr> <wbr>寻找经过结点最少的路径

    63.队列:1. <wbr> <wbr> <wbr> <wbr>寻找经过结点最少的路径

           首先想到的是用队列的思想。a数组是存储扩展结点的队列,a[i]记录经过的城市,b[i]记录前趋城市,这样就可以倒推出最短线路。具体过程如下:
    1 将城市A入队,队首为0、队尾为1
    2)将队首所指的城市所有可直通的城市入队(如果这个城市在队列中出现过就不入队,可用一布尔数组s[i]来判断),将入队城市的前趋城市保存在b[i]中。然后将队首加1,得到新的队首城市。重复以上步骤,直到搜到城市H时,搜索结束。利用b[i]可倒推出最少城市线路。

    代码:

    #include

    #include

    using namespace std;

    int a[10][10];// 0 biao  shi ke zou

    int n;

    int dl[90];

    int pre[10],flag[10];//0 biao shi mei zou

    void input()

    {

           scanf("%d",&n);

           for(int i=1;i<=n;++i)

             for(int j=1;j<=n;++j)

             scanf("%d",&a[i][j]);

    }

    void print(int d)

    {

          

           if(pre[d]!=0)

           print(pre[d]);

           printf("%d->",d);

          

    }

    void BFS()

    {

           int head=0,tail=0;

           ++tail;

           dl[tail]=1;

           pre[1]=0;

           flag[1]=1;//1 baio shi zou guo

           while(head

           {

                  ++head;

                  for(int i=1;i<=n;++i)

                  {

                         if(!flag[i]&&!a[dl[head]][i])

                         {

                                flag[i]=1;

                                ++tail;

                                dl[tail]=i;

                                pre[i]=dl[head];//bian hao

                         }

                         if(dl[tail]==n)

                         {

                                print(pre[n]);

                                head=tail;

                                break;

                         }

                  }

           }

    }

    int main()

    {

           freopen("1.in","r",stdin);

           input();

           BFS();

           printf("%d",n);

           return 0;

    }

  • 相关阅读:
    mysql DATE_FORMAT FROM_UNIXTIME 的区别
    thinkphp按日期(天)统计数据
    ThinkPHP5 (mySQL) 统计各个时间段内的订单量
    转:mysql按时间统计数据,没有数据的时候自动补充0
    SQL的各种连接Join详解
    查询近7天,近1个月,近3个月每天的数据量,查询近一年每个月的数据量
    MySQL 如何生成日期表
    MySQL 生成日期表
    linux达人养成计划学习笔记(一)——命令基本格式及文件处理命令
    rviz学习笔记(二)——Markers: Points and Lines (C++) 点和线
  • 原文地址:https://www.cnblogs.com/c1299401227/p/5370756.html
Copyright © 2011-2022 走看看