15#include "ns3/command-line.h" 
   16#include "ns3/symmetric-adjacency-matrix.h" 
   24main(
int argc, 
char** argv)
 
   26    char srcNodeOpt = 
'A'; 
 
   27    char dstNodeOpt = 
'I'; 
 
   29    cmd.AddValue(
"srcNode", 
"Source node [0-9]", srcNodeOpt);
 
   30    cmd.AddValue(
"dstNode", 
"Destination node [0-9]", dstNodeOpt);
 
   31    cmd.Parse(argc, argv);
 
   33    NS_ABORT_MSG_IF(srcNodeOpt < 
'A' || srcNodeOpt > 
'J', 
"Invalid source node");
 
   34    NS_ABORT_MSG_IF(dstNodeOpt < 
'A' || dstNodeOpt > 
'J', 
"Invalid destination node");
 
   40    constexpr float maxFloat = std::numeric_limits<float>::max();
 
   68    routeWeights.SetValue(0, 1, 5);  
 
   69    routeWeights.SetValue(1, 2, 14); 
 
   70    routeWeights.SetValue(0, 3, 4);  
 
   71    routeWeights.SetValue(1, 5, 3);  
 
   72    routeWeights.SetValue(2, 9, 1);  
 
   73    routeWeights.SetValue(9, 7, 1);  
 
   74    routeWeights.SetValue(2, 8, 7);  
 
   75    routeWeights.SetValue(3, 4, 8);  
 
   76    routeWeights.SetValue(4, 5, 2);  
 
   77    routeWeights.SetValue(5, 6, 4);  
 
   78    routeWeights.SetValue(6, 7, 3);  
 
   79    routeWeights.SetValue(7, 8, 10); 
 
   82    for (
size_t i = 0; i < routeWeights.GetRows(); i++)
 
   84        routeWeights.SetValue(i, i, 0);
 
   87    std::map<std::pair<int, int>, std::vector<int>> routeMap;
 
   89    for (
size_t i = 0; i < routeWeights.GetRows(); i++)
 
   91        for (
size_t j = 0; j < routeWeights.GetRows(); j++)
 
   93            if (routeWeights.GetValue(i, j) != maxFloat)
 
   97                    routeMap[{i, j}] = {(int)i, (
int)j};
 
  101                    routeMap[{i, j}] = std::vector<int>{(int)i};
 
  108    for (
size_t bridgeNode = 0; bridgeNode < routeWeights.GetRows(); bridgeNode++)
 
  110        for (
size_t srcNode = 0; srcNode < routeWeights.GetRows(); srcNode++)
 
  112            for (
size_t dstNode = 0; dstNode < routeWeights.GetRows(); dstNode++)
 
  114                auto weightA = routeWeights.GetValue(srcNode, bridgeNode);
 
  115                auto weightB = routeWeights.GetValue(bridgeNode, dstNode);
 
  117                if (std::max(weightA, weightB) == maxFloat)
 
  122                auto weightAB = routeWeights.GetValue(srcNode, dstNode);
 
  123                if (weightA + weightB < weightAB)
 
  127                    routeWeights.SetValue(srcNode, dstNode, weightA + weightB);
 
  131                    const auto srcToBridgeRoute = routeMap.at({srcNode, bridgeNode});
 
  132                    const auto bridgeToDstRoute = routeMap.at({bridgeNode, dstNode});
 
  133                    std::vector<int> dst;
 
  134                    dst.insert(dst.end(), srcToBridgeRoute.begin(), srcToBridgeRoute.end());
 
  135                    dst.insert(dst.end(), bridgeToDstRoute.begin() + 1, bridgeToDstRoute.end());
 
  136                    routeMap[{srcNode, dstNode}] = dst;
 
  139                    std::vector<int> invDst(dst.rbegin(), dst.rend());
 
  140                    routeMap[{dstNode, srcNode}] = invDst;
 
  147    std::cout << 
"shortest route between " << (char)(srcNodeOpt + 
'A') << 
" and " 
  148              << (char)(dstNodeOpt + 
'A') << 
" (length " 
  149              << routeWeights.GetValue(srcNodeOpt, dstNodeOpt) << 
"):";
 
  150    auto lastNodeNumber = srcNodeOpt;
 
  151    for (
auto nodeNumber : routeMap.at({srcNodeOpt, dstNodeOpt}))
 
  153        std::cout << 
"--" << routeWeights.GetValue(lastNodeNumber, nodeNumber) << 
"-->" 
  154                  << (char)(
'A' + nodeNumber);
 
  155        lastNodeNumber = nodeNumber;
 
  157    std::cout << std::endl;
 
Parse command-line arguments.
A class representing a symmetric adjacency matrix.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.