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}] = {(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.