Проблема возврата к исходному узлу с использованием матрицы смежности - PullRequest
1 голос
/ 19 октября 2019

Я должен управлять всеми городами США (41 на карте, которую нам дали), используя матрицу смежности. Пользователь должен ввести исходный узел, а затем алгоритм должен запустить все города США, а затем вернуться к исходному.

    /* C program for solution of Hamiltonian Cycle problem 
   using backtracking */
#include<stdio.h>

// Number of vertices in the graph

#define infinite 0x3fffffff
#define V 41

void printSolution(int path[]);

/* A utility function to check if the vertex v can be added at 
   index 'pos' in the Hamiltonian Cycle constructed so far (stored 
   in 'path[]') */
bool isSafe(int v, int graph[V][V], int path[], int pos)
{
    /* Check if this vertex is an adjacent vertex of the previously 
       added vertex. */
    if (graph [ path[pos-1] ][ v ] == infinite)
        return false;

    /* Check if the vertex has already been included. 
      This step can be optimized by creating an array of size V */
    for (int i = 0; i < pos; i++)
        if (path[i] == v)
            return false;

    return true;
}

/* A recursive utility function to solve hamiltonian cycle problem */
bool hamCycleUtil(int graph[V][V], int path[], int pos)
{
    /* base case: If all vertices are included in Hamiltonian Cycle */
    if (pos == V)
    {
        // And if there is an edge from the last included vertex to the 
        // first vertex 
        if ( graph[ path[pos-1] ][ path[0] ] > 0 )
            return true;
        else
            return false;
    }

    // Try different vertices as a next candidate in Hamiltonian Cycle. 
    // We don't try for 0 as we included 0 as starting point in hamCycle() 
    for (int v = 0; v < V; v++)
    {
        /* Check if this vertex can be added to Hamiltonian Cycle */
        if (isSafe(v, graph, path, pos))
        {
            path[pos] = v;

            /* recur to construct rest of the path */
            if (hamCycleUtil (graph, path, pos+1) == true)
                return true;


            path[pos] = infinite;
        }
    }


    return false;
}

bool hamCycle(int graph[V][V], int origin)
{
    int f;
    int *path = new int[V];
    for (int i = 0; i < V; i++) {
        path[i] = infinite;
        f++;
    }
    printf("Nodes andadas: %d", f);

    path[0] = origin;
    if ( hamCycleUtil(graph, path, 1) == false )
    {
        printf("\nSolution does not exist");
        return false;
    }

    printSolution(path);
    return true;
}

/* A utility function to print solution */
void printSolution(int path[])
{
    printf ("Solution Exists:"
            " Following is one Hamiltonian Cycle \n");
    for (int i = 0; i < V; i++)
        printf(" %d --> ", path[i]);

    // Let us print the first vertex again to show the complete cycle 
    printf(" %d ", path[0]);
    printf("\n");
}

// driver program to test above function 
int main()
{
    int origin;
    /* Let us create the following graph
       (0)--(1)--(2)
        |   / \   |
        |  /   \  |
        | /     \ |
       (3)-------(4)    */
    int graph1[V][V] =  {     0,       500,    170, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,        infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            500,     0,      420, infinite, 420, infinite, infinite, infinite, infinite, infinite, infinite,                 670, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            170,     420,    0 ,   640, 580, infinite, infinite, infinite, infinite, infinite, infinite,                infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            /*SF-3*/            infinite, infinite, 640, 0 , 300,  380, infinite, infinite, infinite, infinite, infinite,                    infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            infinite, 420, 580, 300,  0, infinite, infinite, 780, infinite, infinite, infinite,                         infinite,      520, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, 380, infinite, 0, 120, 160, 270, infinite, infinite,                           infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, 120, 0, 140, infinite, infinite, 350,                     infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, 780, 160, 140, 0, 290, 440, infinite,                                infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            /*las vegas - 8*/   infinite, infinite, infinite, infinite, infinite, 270, infinite, 290, 0, 470, infinite,                     infinite,      420, infinite, infinite, infinite, infinite,infinite, infinite, infinite, infinite,  infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, 440, 470, 0, 360,                     infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, 350, infinite, infinite, 360, 0,                    infinite,      660, infinite, infinite, infinite, infinite, infinite, infinite, infinite,     1070,      990, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,

            infinite, 670, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,    0,       infinite,      930, infinite, infinite, infinite,     1340, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, 520, infinite, infinite, infinite, 420, infinite, 660,  infinite,                     0,      530, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,  930, 530,                0,      160,      170,      120, infinite,      540, infinite, infinite, infinite, infinite, infinite, infinite,  infinite, infinite, infinite,infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite,  infinite, infinite, infinite, infinite, infinite, infinite, 160,           0,      80, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,  infinite, infinite,  infinite, infinite, 170,           80,      0,      180, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            /*colorado-17*/     infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 120, infinite,          180,       0, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,  1340, infinite, infinite, infinite, infinite, infinite,          0,      380, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,      340,      410, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 540, infinite, infinite, infinite, 380,                 0,     190, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,      470, infinite, infinite, infinite, infinite, infinite,
            /*20*/              infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,  infinite, infinite, infinite, infinite, infinite, infinite, infinite, 190,           0,      550, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,      250, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 1070,  infinite, infinite, infinite, infinite, infinite, 730, infinite, infinite, 550,                     0,     280,      250, infinite, infinite, infinite, infinite,      790, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,      320,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 990,  infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,  280,               0,      310, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,  infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 250, 310,                0,      530, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,  infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 530,           0,      860, infinite,      640,      470, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,  infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 860,            0,      30,      230, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            /*26*/              infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,  infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 30,            0,      180, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 640, 230, 180,                     0,      440, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 790, infinite, infinite, 470, infinite, infinite, 440,                      0,     560, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,      240,      390, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 560,            0,     200, infinite, infinite, infinite, infinite, infinite, infinite, infinite,      710, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,  infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 200,           0,      240, infinite, infinite,      530, infinite,      700,      590, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,  infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,infinite, 240,            0,      210,      150,      640, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,  infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 210,            0,     170, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,  infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 150, 170,                 0,     650, infinite, infinite, infinite, infinite, infinite, infinite, infinite,
            /*34*/              infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,  infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 530, 640, infinite, 650,                     0, infinite,      280, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,  infinite, infinite, infinite, infinite, 340, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,           0,       90, infinite, infinite, infinite, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,  infinite, infinite, infinite, infinite, 410, 470, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 530, infinite, infinite, infinite, 280, 90,                                 0,     180, infinite, infinite,      300, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,  infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 590, infinite, infinite, infinite, infinite, infinite, 180,                0,      290, infinite,      250, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 240, 710, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 290,                     0,      210, infinite, infinite,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,  infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 390, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 210,                0,      290,      140,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 250, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 300, 250, infinite, 290,                          0,      400,
            infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite,  infinite, infinite, infinite, infinite, infinite, infinite, infinite, 320, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, infinite, 140, 400,                     0
};
    // Print the solution
    scanf("%d", &origin);
    hamCycle(graph1, origin);


    return 0;
} 

Моя проблема: алгоритм запускает все узлы, но не возвращает кпроисхождение. Он просто останавливается на последнем узле. Спасибо за помощь

...