Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2017, 13:16   #1
amastudent
 
Регистрация: 17.09.2017
Сообщений: 6
Восклицание Повторяются вершины

Вершины иногда повторяются в гамильтоновом цикле?
Как сделать, чтобы повторялась только начальная в самом конце???

Код:
#include<stdio.h>
#include<conio.h>
#include<iostream>
#include <time.h>
#include <iomanip>
#include <stdlib.h>
//#include <set>
//#include <iterator>
#include <vector>
using namespace std;
vector <int> path;

//заполнение карты
void RandFull(int **mat, int n);
//вывод карты на экран
void DispCard(int **mat, int n);

void calcpath (int **a, int N, int start);
//void calcpath1 (int **a, int N, int start);


int main()
{
    setlocale(LC_ALL, "Rus");
    int city;
    //int min = 0;
    //int sum = 0;
    int i, j;
    int **card;
    int *passed = new int; //пройденные вершины
    int firstcity; //город, с которого начинать движение
    //set <int> pass; //пройденные вершины через множество


    /*int graph[6][6] = {{0,  6,  4,  8,  7,  14},
                        {6,  0,  7,  11, 7,  10},
                        {4,  7,  0,  4,  3,  10},
                        {8,  11, 4,  0,  5,  11},
                        {7,  7,  3,  5,  0,  7},
                        {14, 10, 10, 11, 7,  0},
                      };*/

    cout << "Выберите количество городов:" << endl;
    cin >> city;

    card = new int *[city];
    for (i = 0; i < city; i++) card[i] = new int [city];

    RandFull(card, city);
    DispCard(card, city);

    cout << "С какого города начнем путь?" << endl;
    cin >> firstcity;

    //жадный алгоритм


/*    for (i = 0; i < city; i++){
            min = card[i][city - i];
        for( j = 0; j < city; j++){
            if ((card[i][j] != card[i][i]) && (card[i][j] < min )){

                passed[i] = j;
                //pass.insert(j); // добавить пройденный город во множество
            }
            min = card[i][j];
        }
        sum += min;
    }

     cout << "Маршрут составляет " << sum << " киллометров." << endl;
     //copy( pass.begin(), pass.end(), ostream_iterator<int>(cout, " ")); // вывод элементов множества на экран*/

    calcpath(card, city, firstcity);



    cout << endl;

    //освободить память
    for (i = 0; i < city; i++) delete []card[i];
    delete []card;
    card = NULL;

    delete passed;
    system("pause");
    return 0;



}

void RandFull(int **mat, int n){
    srand(time(NULL));
    for (int i = 0; i < n ; i++){
        for (int j = 0; j < n; j++){
            if (i == j) mat[i][j] = 0;
        else{
            mat[i][j] = 1 + (rand()% 15);
            mat[j][i] = mat[i][j];
        }
        }
    }

}

void DispCard(int **mat, int n){
    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; j++){
            cout << setw(4) << mat[i][j];
        }
        cout << endl;
    }

}

void calcpath (int **a, int N, int start)
{
    int min = 999, p_min = 0, path_length = 0, k;
    path.push_back(start);


    for (int i = start - 1; ; )
    {
        for (int j = 0; j < N; j++)
        {
            if (a[i][j] < min && a[i][j] != 0 ) // &&find(path.begin(), path.end(), a[i][j]) == path.end добавить условие, чтобы проверить пройдена ли вершина
            {
                min = a[i][j];
                p_min = j;
            }
        }

        path.push_back(p_min + 1);
        path_length += min;


        a[i][p_min] = 0;
        a[p_min][i] = 0;
        i = p_min;
        min = 999;
        k = 0;

        for (int a = 1; a <= N; a++)
        {
            for (int b = 0; b < path.size(); b++)
            {
                if (a == path[b])
                {
                    k++;
                    continue;
                }
            }
        }

        if (k == N)
            break;
    }

    for (int i = 0; i < path.size(); i++)
    cout << path[i] << " -> " ;

    cout << endl;
    cout << path_length;
}
Изображения
Тип файла: jpg img-2017-09-18-13-12-36.jpg (64.2 Кб, 121 просмотров)
amastudent вне форума Ответить с цитированием
Старый 20.09.2017, 06:48   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

При поиске проверять, чтобы повторов не было
Black Fregat вне форума Ответить с цитированием
Старый 24.09.2017, 18:40   #3
amastudent
 
Регистрация: 17.09.2017
Сообщений: 6
По умолчанию

я это понимаю, вопрос состоит в том, как это реализовать через вектор или хотя бы как-нибудь??
amastudent вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Данные в ячейках не повторяются zont_11 Microsoft Office Excel 3 27.11.2014 16:14
Выпадающий список из БД повторяются значения Решетова Алена PHP 2 14.05.2013 15:05
Подсчёт суммы значений, которые повторяются JevgenijM Microsoft Office Excel 5 22.02.2013 08:14
поиск слов в строке, которые повторяются КРИЖ Общие вопросы C/C++ 2 14.12.2012 13:31
(С++) поиск слов в строке, которые повторяются КРИЖ Помощь студентам 0 13.12.2012 19:25