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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2009, 08:49   #1
Sheh
Новичок
Джуниор
 
Регистрация: 15.05.2009
Сообщений: 2
По умолчанию Представление ориентированного графа

Добрый день! Мне нужно представить в программе ориентированный граф, с дугами разной длинны. Разумется, для этого не плохо было бы использовать STL. Но вот даже книжка Архангельского пока помогла не полностью.

Пока нашел один примерчик:

typedef vector<pair<int,int>> graf_line;
typedef graf_line::iterator graf_iter;
typedef vector<graf_line> graf;

graf g (n); // создаём граф из n вершин

А как задать длинну каждой дуги и её направление (ну и соответственно в дальнейшем обращаться к ним), помогите примером, кто знает.
Sheh вне форума Ответить с цитированием
Старый 15.05.2009, 21:35   #2
Sheh
Новичок
Джуниор
 
Регистрация: 15.05.2009
Сообщений: 2
По умолчанию

Нашёл как ра то, что мне нужно, алгоритм Форда-Беллмана. С помощью этого алгоритма можно найти кратчайшие пути между заданной вершиной и всеми остальными вершинами

Однако я не могу забить объявленный в данном коде граф собственными значениями. Что я только не делал, Builder выдаёт ошибку. Граф должен быть ориентированным, с дугами разной длинны

Код:
typedef pair<int,int> rib;
typedef vector<rib> graph_line;
typedef graph_line::iterator graph_iter;
typedef vector<graph_line> graph;
 
const int inf = 1000*1000*1000;
 
int main()
{
 
        int n;
        graph g;
 
        // ...Тут должна быть инициализация  графа ...
 
        vector<long long> d (n, inf);
        d[0] = 0;
        vector<int> from (n, -1);
        from[0] = 0;
        for (int count=1; count<n; count++)
        {
                bool anychanged = false;
                for (int v=0; v<n; v++)
                        if (d[v] != inf)
                                for (graph_iter i=g[v].begin(); i!=g[v].end(); ++i)
                                {
                                        int to = i->first, l = i->second;
                                        if (d[to] > d[v]+l)
                                        {
                                                d[to] = d[v]+l;
                                                from[to] = v;
                                                anychanged = true;
                                        }
                                }
                if (!anychanged) break;
        }
 
        ... вывод массива d ...

Небольшое описание алгоритма на http://e-maxx.ru/algo/floyd_warshall_algorithm
Sheh вне форума Ответить с цитированием
Старый 16.02.2011, 19:28   #3
Crazy_nurs
Новичок
Джуниор
 
Регистрация: 16.02.2011
Сообщений: 1
По умолчанию

Здравствуй,если тебе не трудно скинь весь код программы. Очееееееееееень нужно!!!!!!!!!! Это же на алгоритме Флойда основано??????????
Crazy_nurs вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Связность графа. Пaвeл Помощь студентам 0 26.04.2009 10:42
Обход графа в глубину coptor Общие вопросы Delphi 0 09.12.2008 22:50
Различные представление числа N в виде сумм Дамир Помощь студентам 4 07.12.2008 21:57
Как убрать экспонециальное представление числа alf19 Microsoft Office Excel 2 22.07.2008 16:45
Просмотр представление числа в памьяти IgorKr Общие вопросы Delphi 1 21.11.2007 08:47