矩阵幂运算用于计算可能的路由数

Matrix Exponentiation for calculating number of routes possible

本文关键字:路由 计算 运算 用于      更新时间:2023-10-16

最近我在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,应该返回单位矩阵,而不是实际的矩阵。