Учитывая ориентированный граф и две вершины ‘u’ и ‘v’ в нем, подсчитайте все возможные пути от ‘u’ до ‘v’ с ровно k ребрами на пути

#c #graph #dynamic-programming

#c #График #динамическое программирование

Вопрос:

Мой код не работает для следующего тестового примера, пожалуйста, помогите

 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 x N двоичных значений, которые представляют граф [N] [N] . Третья строка каждого тестового примера содержит 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}

МОЙ КОД

 #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;
}
  

Комментарии:

1. Это похоже на проблему, которую было бы намного проще решить с помощью рекурсивного алгоритма. Я буду честен, этот код действительно трудно читать для большого резонанса, например, нет значимых имен переменных (например arr , вероятно, должно быть AdjMat ), я бы также рекомендовал отредактировать вопрос, чтобы входные данные (двоичная строка) были в виде представления матрицы смежности

2.https://www.geeksforgeeks.org/find-the-number-of-paths-of-length-k-in-a-directed-graph ?