bfs.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:6k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * bfs.cc
  3.  * Copyright (C) 2000 by the University of Southern California
  4.  * $Id: bfs.cc,v 1.6 2006/02/21 15:20:19 mahrenho Exp $
  5.  *
  6.  * This program is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU General Public License,
  8.  * version 2, as published by the Free Software Foundation.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License along
  16.  * with this program; if not, write to the Free Software Foundation, Inc.,
  17.  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  18.  *
  19.  *
  20.  * The copyright of this module includes the following
  21.  * linking-with-specific-other-licenses addition:
  22.  *
  23.  * In addition, as a special exception, the copyright holders of
  24.  * this module give you permission to combine (via static or
  25.  * dynamic linking) this module with free software programs or
  26.  * libraries that are released under the GNU LGPL and with code
  27.  * included in the standard release of ns-2 under the Apache 2.0
  28.  * license or under otherwise-compatible licenses with advertising
  29.  * requirements (or modified versions of such code, with unchanged
  30.  * license).  You may copy and distribute such a system following the
  31.  * terms of the GNU GPL for this module and the licenses of the
  32.  * other code concerned, provided that you include the source code of
  33.  * that other code when and as the GNU GPL requires distribution of
  34.  * source code.
  35.  *
  36.  * Note that people who make modified versions of this module
  37.  * are not obligated to grant this special exception for their
  38.  * modified versions; it is their choice whether to do so.  The GNU
  39.  * General Public License gives permission to release a modified
  40.  * version without this exception; this exception also makes it
  41.  * possible to release a modified version which carries forward this
  42.  * exception.
  43.  *
  44.  */
  45. /*
  46.  * Implementation of Breadth First Search algorithm
  47.  * contributed to ns
  48.  * George Riley, Georgia Tech, Winter 2000
  49.  *
  50.  */
  51. #include "config.h"
  52. #ifdef HAVE_STL
  53. #include "routealgo/bfs.h"
  54. #include "routealgo/routealgo.h"
  55. #include "routealgo/rnode.h"
  56. #include "routealgo/tnode.h"
  57. #include "routealgo/rbitmap.h"
  58. #include <stdio.h>
  59. #ifndef TEST_BFS
  60. void BFS(
  61.          RNodeVec_t& N,
  62.          nodeid_t root,
  63.          RoutingVec_t& NextHop,
  64.          RoutingVec_t& Parent)
  65. {  // Compute shortest path to all nodes from node S using BreadthFirstSearch
  66. BitMap B(N.size()); // Make a bitmap for the colors (grey/white) (white = 0)
  67. RNodeDeq_t Q;       // And a vector for the Q list
  68. DistVec_t  D;       // And the distance vector
  69.  // Fill in all "NONE" in the next hop neighbors and predecessors
  70.  NextHop.erase(NextHop.begin(), NextHop.end());
  71.  Parent.erase(Parent.begin(), Parent.end());
  72.  for (unsigned int i = 0; i < N.size(); i++)
  73.    {
  74.      NextHop.push_back(NODE_NONE);
  75.      Parent.push_back(NODE_NONE);
  76.      D.push_back(INF);
  77.      // Debug...print adj lists
  78.      NodeWeight_t v(NODE_NONE, INF);
  79.      //     if(0)printf("Printing adj for node %ld (addr %p)n", N[i]->m_id, N[i]);
  80.      // if(0)while(1)
  81.      //        {
  82.      //          v = N[i]->NextAdj(v);
  83.      //          if (v.first == NODE_NONE) break;
  84.      //          if(0)printf("Found adj %ldn", v.first);
  85.      //        }
  86.    }
  87.  B.Set(root); // Color the root grey
  88.  if(0)B.DBPrint();
  89.  Q.push_back(N[root]); // And put the root in Q
  90.  D[root] = 0;
  91.  while(Q.size() != 0)
  92.    {
  93.      RNodeDeq_it it = Q.begin();
  94.      NodeWeight_t v(NODE_NONE, INF);
  95.      RNode* u = *it;
  96.      //if(0)printf("Working on node %ld addr %pn", u->m_id, u);
  97.      while(1)
  98.        {
  99.          v = u->NextAdj(v);
  100.          if (v.first == NODE_NONE) break;
  101.          if(0)printf("Found adj %ldn", v.first);
  102.          if (B.Get(v.first) == 0)
  103.            { // White
  104.              Q.push_back(N[v.first]);     // Add to Q set
  105.              B.Set(v.first);              // Change to grey
  106.              D[v.first] = D[u->m_id] + 1; // Set new distance
  107.              Parent[v.first] = u->m_id;   // Set parent
  108.              if (u->m_id == root)
  109.                { // First hop is new node since this is root
  110.                  NextHop[v.first] = v.first;
  111.                }
  112.              else
  113.                { // First hop is same as this one
  114.                  NextHop[v.first] = NextHop[u->m_id];
  115.                }
  116.              if(0)printf("Enqueued %ldn", v.first);
  117.            }
  118.        }
  119.      Q.pop_front();
  120.    }
  121. }
  122. #endif
  123. #ifdef TEST_BFS
  124. RNodeVec_t Nodes;
  125. int main()
  126. {
  127.   // See the sample BFS search in Fig23.3, p471 CLR Algorithms book
  128. Node N0(0);
  129. Node N1(1);
  130. Node N2(2);
  131. Node N3(3);
  132. Node N4(4);
  133. Node N5(5);
  134. Node N6(6);
  135. Node N7(7);
  136. RoutingVec_t NextHop;
  137. RoutingVec_t Parent;
  138.  N0.AddAdj(1);
  139.  N0.AddAdj(2);
  140.  N1.AddAdj(0);
  141.  N2.AddAdj(0);
  142.  N2.AddAdj(3);
  143.  N3.AddAdj(2);
  144.  N3.AddAdj(4);
  145.  N3.AddAdj(5);
  146.  N4.AddAdj(3);
  147.  N4.AddAdj(5);
  148.  N4.AddAdj(6);
  149.  N5.AddAdj(4);
  150.  N5.AddAdj(7); 
  151.  N6.AddAdj(4);
  152.  N6.AddAdj(7);
  153.  N7.AddAdj(5);
  154.  N7.AddAdj(6);
  155.  Nodes.push_back(&N0);
  156.  Nodes.push_back(&N1);
  157.  Nodes.push_back(&N2);
  158.  Nodes.push_back(&N3);
  159.  Nodes.push_back(&N4);
  160.  Nodes.push_back(&N5);
  161.  Nodes.push_back(&N6);
  162.  Nodes.push_back(&N7);
  163.  for (nodeid_t i = 0; i < Nodes.size(); i++)
  164.    { // Get shortest path for each root node
  165.      printf("nFrom root %ldn", i);
  166.      BFS(Nodes, i, NextHop, Parent);
  167.      PrintParents(Parent);
  168.      for (unsigned int k = 0; k < Nodes.size(); k++)
  169.        printf("Next hop for node %d is %ldn", k, NextHop[k]);
  170.      printf("Printing pathsn");
  171.      for (nodeid_t j = 0; j < Nodes.size(); j++)
  172.        {
  173.          PrintRoute(i, j, Parent);
  174.        }
  175.    }
  176.  return(0);
  177. }
  178. #endif
  179. #endif //HAVE_STL