Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Самый короткий путь в ориентировонном графе, найти путь 
V
    Опции темы
sas8899
Дата 25.12.2007, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 27.10.2007

Репутация: нет
Всего: нет



Нужно найти самый короткий путь между двумя вершинами ориентированного графа.
Знаю то нужно пройти граф через Breadth First Search, но не знаю как посчитать этот путь.
Код


int pathXY(struct graf d,int x,int y)
{
    int i,j,is,iss;
    int s[100],viz[100];//в массив S записываю вершины при прохождении графа BFS, а в VIZ запоминает если эту вершину посетил
    if (x==y) return 0;
    for (i=0;i<d.n;i++) //задаю начальные значения в массивах
    {
        s[i]=-1;
        viz[i]=-1;
    }
    is=0;
    s[is]=x;
    viz[x]=0;
    iss=0;
    while (s[iss]!=y && s[iss]!=-1)//прохожу BFS и пишу вершины в массив S
    {
        for (j=0;j<d.n;j++)
        {
            if (d.a[s[iss]][j] && viz[j]==-1)
            {
                is++;
                s[is]=j;
                viz[j]=viz[s[iss]]+1;
            }
        }
        iss++;
    }
    return viz[y];
}


Заранее благодарю за помощь.

Это сообщение отредактировал(а) sas8899 - 26.12.2007, 20:35
PM MAIL   Вверх
maxim1000
Дата 26.12.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



на данный момент для каждой вершины viz хранит одно из двух значений:
0 - не посещалась
1 - посещалась
можно расширить
-1 - не посещалась
L>=0 - посещалась и кратчайшее расстояние = L
т.е. вместо viz[j]=1 можно писать viz[j]=viz[s[iss]]+1

P.S.
всё-таки я бы советовал более красноречиво называть переменные smile

P.P.S.
на всякий случай уточню: все рёбра имеют одинаковую длину?


--------------------
qqq
PM WWW   Вверх
sas8899
Дата 26.12.2007, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 27.10.2007

Репутация: нет
Всего: нет



maxim1000, да все ребра имеют одинаковую длину.

P.S Что имеешь ввиду насчет переменных? Как правильно их называть?

P.P.S. Отредактировал код, это ты имел ввиду?

Это сообщение отредактировал(а) sas8899 - 26.12.2007, 19:01
PM MAIL   Вверх
maxim1000
Дата 26.12.2007, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



ну хотя бы x -> start, y -> finish


--------------------
qqq
PM WWW   Вверх
sas8899
Дата 26.12.2007, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 27.10.2007

Репутация: нет
Всего: нет



вот с этого файла у меня создается граф

7
0 1 0 0 0 0 0
1 0 1 0 0 0 0
1 0 0 1 0 0 0
0 0 1 0 1 0 0
1 0 0 0 0 1 0
0 0 0 0 0 0 1
0 0 0 0 0 0 0

когда существует путь от вершины Х к вершине У то все считает нормально, а вот к примеру есть путь от 4 до 5, но обратно нету, и если ввожу х=5 и у=4 то выдает ответ 4, хотя никак из 5 в 4 не попасть.

Добавлено через 1 минуту и 3 секунды
maxim1000, хорошо  smile буду иметь ввиду на будующее, спасибо smile 
PM MAIL   Вверх
maxim1000
Дата 26.12.2007, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



ну так это надо отладчиком пройтись
главное: представлять в голове, как оно должно работать, тогда не составляет трудности в любой момент понять, какие должны быть значения в массивах и сравнить их с теми, которые в программе, а значит, и найти место, где программа начинает вести себя не так, как хотелось бы

Добавлено через 3 минуты и 37 секунд
Цитата(sas8899 @  26.12.2007,  19:05 Найти цитируемый пост)
хотя никак из 5 в 4 не попасть.

это зависит от того, как задаётся матрица
если "откуда" откладывается по горизонтали, а "куда" - по вертикали, то из 5 в 4 как раз можно попасть

Добавлено через 3 минуты и 52 секунды
т.е. стоит ещё и проверить, правильно ли читается матрица...


--------------------
qqq
PM WWW   Вверх
sas8899
Дата 26.12.2007, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 27.10.2007

Репутация: нет
Всего: нет



Код


void create(struct graf* d)
{
    FILE *filein;
    int i,j;

    filein=fopen("pr1.in","r");
    fscanf(filein,"%d\n",&d->n);
    for (i=0; i<d->n; i++)
    {
        for (j=0; j<d->n; j++)
            fscanf(filein,"%d",&d->a[i][j]);
        fscanf(filein,"\n");
    }
}


Вот как у меня читается матрица.

P.S. Отсчет вершин начинается с 0.

Добавлено через 11 минут и 57 секунд
maxim1000, все спасибо я разобрался в чем дело.

P.S. Исправил код, если кому-то еще понадобится.

Это сообщение отредактировал(а) sas8899 - 26.12.2007, 20:27
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0670 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.