矩阵幂运算用于计算可能的路由数
Matrix Exponentiation for calculating number of routes possible
最近我在iarc网站上遇到了这个问题。下面是问题说明:
众所周知,Internet上使用的路由算法是高度好不。在互联网术语中,"跳"是一对节点它们是直接连接的——通过电缆或微波链路或无论什么。数据包从1到1所经过的跳数节点到另一个节点可能远远超过所需的最小值。
但是Siruseri网络公司使用的路由算法是更糟。在这里,从一个节点发送到另一个节点的数据包甚至可以发送两次遍历同一节点,甚至两次遍历同一跳它最终会找到到达目的地的路。有时是一个包甚至在到达目的地之前会经过不止一次认为"交付"。假设西鲁塞里的网络包括图
有5个节点和8条电缆链路。注意一对节点可能是由多个链路连接的。这些被认为是不同的啤酒花。所有链路都是双向的。从节点1到节点5的数据包可能,例如:1到2、2到1、1到3、3到2、2到1到4,4到5,5到4,4到5。这条路由的长度是9跳数是给定路由的长度)。我们对计算从给定源到a的不同路由的数量
指定长度的目标。例如,从1到2的长度为3的路由数为7。分别为:1 ~ 2、2 ~ 1、1 ~ 2;1到3,3对1和1对2;1到4,4到1,1到2;1到5,5到1和12;1至4、4至3(通过左线)、3至2;1到4,4到3(通过右边的电缆)和3到2;1到2、2到3、3到2.
您将获得Siruseri网络的描述以及一个源,一个目标和跳数,你的任务是确定从源到目标的路由数量有给定的跳数。答案是报告模42373 .
因此,正如在这个线程中讨论的,解决方案是计算给定矩阵的k次方,其中k是给定的路由数。
这里我做了同样的事情:
#include <iostream>
#include <vector>
std::vector<std::vector<int> >MatrixMultiplication(std::vector<std::vector<int> >matrix1,std::vector<std::vector<int> >matrix2,int n){
std::vector<std::vector<int> >retMatrix(n,std::vector<int>(n));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=0;k<n;k++){
retMatrix[i][j] = retMatrix[i][j] + matrix1[i][k] * matrix2[k][j];
}
}
}
return retMatrix;
}
std::vector<std::vector<int> >MatrixExponentiation(std::vector<std::vector<int> >matrix,int n,int power){
if(power == 0 || power == 1){
return matrix;
}
if(power%2 == 0){
return MatrixExponentiation(MatrixMultiplication(matrix,matrix,n),n,power/2);
}else{
return MatrixMultiplication(matrix,MatrixExponentiation(MatrixMultiplication(matrix,matrix,n),n,(power-1)/2),n);
}
}
int main (int argc, char const* argv[])
{
int n;
std::cin >> n;
std::vector<std::vector<int> >matrix(n,std::vector<int>(n));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
std::cin >> matrix[i][j];
}
}
int i ,j ,power;
std::cin >> i >> j >> power;
std::vector<std::vector<int> >retMax(n,std::vector<int>(n));
retMax = MatrixExponentiation(matrix,n,power);
std::cout << matrix[i-1][j-1] << std::endl;
return 0;
}
但是输出不匹配,甚至对于示例情况,我在这里错过了什么,或者我必须尝试另一种方法来解决这个问题?
编辑:正如@grigor建议的那样,我更改了power == 0的代码以返回单位矩阵,但代码仍然产生错误的输出,
if(power == 0){
std::vector<std::vector<int> >retMatrix(n,std::vector<int>(n));
for(int i=0;i<n;i++){
retMatrix[i][i] = 1;
}
return retMatrix;
}
注意:我没有写模的东西的代码,你认为它会影响的例子测试用例?
我想你只是打印了错误的值,更改:
std::cout << matrix[i-1][j-1] << std::endl;
std::cout << retMax [i-1][j-1] << std::endl;
如果是power == 0
,应该返回单位矩阵,而不是实际的矩阵。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数据类型的范围,例如int
- 类似枚举的计算常量
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 计算缩放多边形的比例,得到给定的多边形面积
- 在C++中如何在没有pow的情况下进行基础计算
- 计算平均值,不包括上次得分
- 矩阵幂运算用于计算可能的路由数