⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dijkstra.cc

📁 本程序是一些路由算法的源代码
💻 CC
字号:
/* * Copyright (c) 2000 University of Southern California. * All rights reserved.                                             *                                                                 * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, advertising * materials, and other materials related to such distribution and use * acknowledge that the software was developed by the University of * Southern California, Information Sciences Institute.  The name of the * University may not be used to endorse or promote products derived from * this software without specific prior written permission. *  * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * * Implementation of Dijkstra's SPF algorithm * contributed to ns * George Riley, Georgia Tech, Winter 2000 */#include "config.h"#ifdef HAVE_STL#include "routealgo/dijkstra.h"#include "routealgo/routealgo.h"#include "routealgo/tnode.h"#include <stdio.h>#ifndef TEST_DIJ// Declare a multimap for maintaining a sorted Q settypedef multimap<dist_t, nodeid_t> Q_t;typedef Q_t::iterator              Q_it;typedef Q_t::value_type            QPair_t;void Dijkstra(              RNodeVec_t& N,              nodeid_t root,              RoutingVec_t& NextHop,              RoutingVec_t& Parent){  // Compute shortest path to all nodes from node SQ_t Q;Q_t S; // The completed set, with final weights // First make the Q set, with all infinity except the source for ( RNodeVec_it i = N.begin(); i != N.end(); i++)   {     if ((*i)->m_id == root)       Q.insert(QPair_t(0, root));     else       Q.insert(QPair_t(INF, (*i)->m_id));   } // Fill in all "NONE" in the next hop neighbors and predecessors NextHop.erase(NextHop.begin(), NextHop.end()); Parent.erase(Parent.begin(), Parent.end()); for (unsigned int i = 0; i < N.size(); i++)   {     NextHop.push_back(NODE_NONE);     Parent.push_back(NODE_NONE);   } while(Q.size() != 0)   {     Q_it u = Q.begin(); // Smallest     if(0)printf("Smallest is node %ld dist %ld\n", u->second, u->first);     S.insert(QPair_t(u->first, u->second)); // Add to S for later printout     // Now relax each of the adjacent edges     RNodeVec_it n;     for (n = N.begin(); n != N.end() ;n++)       {         if ((*n)->m_id == u->second) break; // Found it       }     if (n == N.end())       {         printf("ERROR! Can't find node %ld\n", u->second);         exit(1);       }     NodeWeight_t e(NODE_NONE, 0);     while(1)       { // Relax each adjacent node         Q_it a;         e = (*n)->NextAdj(e); // Next adj         if (e.first == NODE_NONE) break; // Done..         if(0)printf("Looking for adj node %ld\n", e.first);         for (a = Q.begin(); a != Q.end(); a++)           {             if(0) printf("Searching,a->second %ld e.first %ld\n",                      a->second,e.first);             if (a->second == e.first) break; // Found it           }         if (a != Q.end())           { // Not removed yet             if(0)printf("Found it, edge weight is %d\n", e.second);             dist_t d = u->first + e.second; // New distance to the adj             if (d < a->first)               { // Found new best path, remove and re-insert                 // Update the next hop neighbor vector                 if (u->second == root)                   { // First hop                     if(0)printf("Assuming first hop %ld\n",u->second);                     NextHop[a->second] = a->second;                   }                 else                   { // Else hop to new one through same one to me                     NextHop[a->second] = NextHop[u->second];                   }                 // And re-insert new smaller dist into Q set                 nodeid_t nid = a->second;                 if(0)printf("Found new best d to node %ld dist %ld\n",nid, d);                 if(0)printf("u->first %ld e->m_w %d\n", u->first, e.second);                 Q.erase(a);                 Q.insert(QPair_t(d, nid));                 // And set parent                 Parent[nid] = u->second;               }           }       }     Q.erase(u);   }  for (Q_it q = S.begin(); q != S.end(); q++)    printf("Node %ld dist %ld\n", q->second, q->first);}#endif#ifdef TEST_DIJRNodeVec_t Nodes;int main(){Node N0(0);Node N1(1);Node N2(2);Node N3(3);Node N4(4);RoutingVec_t NextHop;RoutingVec_t Parent; N0.AddAdj(1, 10); N0.AddAdj(2, 5); N1.AddAdj(3, 1); N1.AddAdj(2, 2); N2.AddAdj(4, 2); N2.AddAdj(1, 3); N2.AddAdj(3, 9); N3.AddAdj(4, 4); N4.AddAdj(0, 7); N4.AddAdj(3, 6); Nodes.push_back(&N0); Nodes.push_back(&N1); Nodes.push_back(&N2); Nodes.push_back(&N3); Nodes.push_back(&N4); for (nodeid_t i = 0; i < Nodes.size(); i++)   { // Get shortest path for each root node     printf("\nFrom root %ld\n", i);     Dijkstra(Nodes, i, NextHop, Parent);     PrintParents(Parent);     for (unsigned int k = 0; k < Nodes.size(); k++)       printf("Next hop for node %d is %ld\n", k, NextHop[k]);     printf("Printing paths\n");     for (nodeid_t j = 0; j < Nodes.size(); j++)       {         PrintRoute(i, j, Parent);       }   } return(0);}#endif#endif /* STL */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -