C++ 给定一个有向图和其中的两个顶点“u”和“v”,计算从“u”到“v”的所有可能的行走,行走上正好有k条边

C++ 给定一个有向图和其中的两个顶点“u”和“v”,计算从“u”到“v”的所有可能的行走,行走上正好有k条边,c++,graph,dynamic-programming,C++,Graph,Dynamic Programming,我的代码在以下测试用例中失败,请帮助 1 10 1 1 1 1 0 0 0 1 0 1 0 1 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 1 1 0 1 0 1 1 1 0 1 1 2 7 3 Its Correct output

我的代码在以下测试用例中失败,请帮助

1
10
1 1 1 1 0 0 0 1 0 1
0 1 1 0 0 0 1 1 1 1
0 0 0 1 0 1 1 1 0 1
0 0 0 1 0 0 0 1 1 1
1 1 1 1 1 1 1 1 0 1
0 0 0 0 0 1 0 0 1 0
1 0 1 0 1 0 1 1 1 0
0 1 0 0 0 0 1 0 1 0
0 1 0 1 1 0 0 0 0 1
1 0 1 0 1 1 1 0 1 1
2 7 3

Its Correct output is:
11

And Your Code's output is:
6
给定一个有向图和其中的两个顶点“u”和“v”,计算从“u”到“v”的所有可能的行走,行走上正好有k条边

输入:

输入的第一行包含一个整数T,表示测试用例的数量。然后,T测试用例随之出现。每个测试用例由三行组成。 每个测试用例的第一行是N,它是输入图中的顶点数。 每个测试用例的第二行包含表示图[N][N]的nxn个二进制值。 每个测试用例的第三行包含u、v、k,其中u是起始位置,v是目的地,k是边数

Output:

Print all possible walks from 'u' to 'v'.

Constraints:

1 ≤ T ≤ 50
1 ≤ N ≤ 20
0 ≤ graph[][] ≤ 1

Example:

Input
1
4
0 1 1 1
0 0 0 1
0 0 0 1
0 0 0 0
0 3 2

Output
2
说明:

例如考虑下面的图表。让源“u”为顶点0,目标“v”为3,k为2。输出应该是2,因为从0到3有两个行走,正好有2条边。行走是{0,2,3}和{0,1,3}

我的代码


这似乎是一个使用递归算法更容易解决的问题。老实说,这段代码在很多方面都很难读懂,例如没有有意义的变量名,例如arr可能应该是邻接的。我还建议编辑这个问题,这样输入的二进制字符串将以邻接矩阵表示的形式出现?
#include <iostream>
using namespace std;

int main() {
    //code
    int t;
    cin>>t;
    while(t--)
    {
        int r,c;
        cin>>r;
        c=r;
        int arr[r][c];
        for(int i=0;i<r;i++)
        {
            for(int j=0;j<c;j++)
            {
                cin>>arr[i][j];
            }
        }
        int u,v,k;
        cin>>u>>v>>k;
        int dp[r][k+1];
        for(int i=0;i<r;i++)
        {
            for(int j=0;j<k+1;j++)
            {
                dp[i][j]=0;
            }
        }
        dp[u][0]=1;

        for(int j=0;j<k+1;j++)
            {
               for(int i=0;i<r;i++)
              {
                if(dp[i][j]!=0)
                {
                    for(int x=0;x<r;x++)
                    {
                        if(arr[i][x]==1)
                        {if(j+1<k+1)
                            dp[x][j+1]++;
                        }
                    }
                }
               }
            }
            cout<<dp[v][k]<<endl;
        
        
    }
    return 0;
}