20#include "ns3/command-line.h"
21#include "ns3/symmetric-adjacency-matrix.h"
29main(
int argc,
char** argv)
31 char srcNodeOpt =
'A';
32 char dstNodeOpt =
'I';
34 cmd.AddValue(
"srcNode",
"Source node [0-9]", srcNodeOpt);
35 cmd.AddValue(
"dstNode",
"Destination node [0-9]", dstNodeOpt);
36 cmd.Parse(argc, argv);
38 NS_ABORT_MSG_IF(srcNodeOpt <
'A' || srcNodeOpt >
'J',
"Invalid source node");
39 NS_ABORT_MSG_IF(dstNodeOpt <
'A' || dstNodeOpt >
'J',
"Invalid destination node");
45 constexpr float maxFloat = std::numeric_limits<float>::max();
73 routeWeights.SetValue(0, 1, 5);
74 routeWeights.SetValue(1, 2, 14);
75 routeWeights.SetValue(0, 3, 4);
76 routeWeights.SetValue(1, 5, 3);
77 routeWeights.SetValue(2, 9, 1);
78 routeWeights.SetValue(9, 7, 1);
79 routeWeights.SetValue(2, 8, 7);
80 routeWeights.SetValue(3, 4, 8);
81 routeWeights.SetValue(4, 5, 2);
82 routeWeights.SetValue(5, 6, 4);
83 routeWeights.SetValue(6, 7, 3);
84 routeWeights.SetValue(7, 8, 10);
87 for (
size_t i = 0; i < routeWeights.GetRows(); i++)
89 routeWeights.SetValue(i, i, 0);
92 std::map<std::pair<int, int>, std::vector<int>> routeMap;
94 for (
size_t i = 0; i < routeWeights.GetRows(); i++)
96 for (
size_t j = 0; j < routeWeights.GetRows(); j++)
98 if (routeWeights.GetValue(i, j) != maxFloat)
102 routeMap[{i, j}] = {(int)i, (
int)j};
106 routeMap[{i, j}] = std::vector<int>{(int)i};
113 for (
size_t bridgeNode = 0; bridgeNode < routeWeights.GetRows(); bridgeNode++)
115 for (
size_t srcNode = 0; srcNode < routeWeights.GetRows(); srcNode++)
117 for (
size_t dstNode = 0; dstNode < routeWeights.GetRows(); dstNode++)
119 auto weightA = routeWeights.GetValue(srcNode, bridgeNode);
120 auto weightB = routeWeights.GetValue(bridgeNode, dstNode);
122 if (std::max(weightA, weightB) == maxFloat)
127 auto weightAB = routeWeights.GetValue(srcNode, dstNode);
128 if (weightA + weightB < weightAB)
132 routeWeights.SetValue(srcNode, dstNode, weightA + weightB);
136 const auto srcToBridgeRoute = routeMap.at({srcNode, bridgeNode});
137 const auto bridgeToDstRoute = routeMap.at({bridgeNode, dstNode});
138 std::vector<int> dst;
139 dst.insert(dst.end(), srcToBridgeRoute.begin(), srcToBridgeRoute.end());
140 dst.insert(dst.end(), bridgeToDstRoute.begin() + 1, bridgeToDstRoute.end());
141 routeMap[{srcNode, dstNode}] = dst;
144 std::vector<int> invDst(dst.rbegin(), dst.rend());
145 routeMap[{dstNode, srcNode}] = invDst;
152 std::cout <<
"shortest route between " << (char)(srcNodeOpt +
'A') <<
" and "
153 << (char)(dstNodeOpt +
'A') <<
" (length "
154 << routeWeights.GetValue(srcNodeOpt, dstNodeOpt) <<
"):";
155 auto lastNodeNumber = srcNodeOpt;
156 for (
auto nodeNumber : routeMap.at({srcNodeOpt, dstNodeOpt}))
158 std::cout <<
"--" << routeWeights.GetValue(lastNodeNumber, nodeNumber) <<
"-->"
159 << (char)(
'A' + nodeNumber);
160 lastNodeNumber = nodeNumber;
162 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.