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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.08.2010, 18:22   #1
DemonScorpion
Новичок
Джуниор
 
Регистрация: 27.09.2009
Сообщений: 1
По умолчанию Алгоритм Дейкстры (С++)

Здравствуйте. Задача: просто реализовать алгоритм Дейкстры.
Имеется взвешенный ориентированный граф из N вершин и M ребер. Требуется найти длины кратчайших путей от первой вершины до всех остальных.
Входные данные:
Первая строка входных данных содержит два числа: 1 ≤ N ≤ 1000 и 0 ≤ M ≤ 1000000 – количество вершин и ребер. В каждой из следующих N строк содержится тройка чисел u, v, w, задающих ориентированное ребро графа <u, v> с весом w, где 1 ≤ u, v ≤ N, 1 ≤ w ≤ 1000.

Выходные данные:
В единственной строке выходного файла должно содержаться N чисел, разделенных проблемами, где i-ое число это длина кратчайшего пути между первой вершиной и i-ой (если пути не существует то вывести 1073741824)

Пример входных данных:
4 3
1 2 5
2 3 5
1 3 2

Пример выходных данных:
0 5 2 1073741824

Я написал программу, но вот проблема, она проходит не все тесты.
Код:
#include <cstdlib>
#include <iostream>

using namespace std;

int main() {
    const int size = 1000;  //размер массивов
    //массив d[] - после работы алгоритма хранит расстояния от 1 
    //вершины до всех остальных
    _int64 d[size];
    // массив u[] - массив пометок, хранит вершины до которых 
    // расстояние уже посчитано             
    bool u[size];
    // массив w[][] - массив весов w[ i ][ j ] = -1, если не существует    
    // ребра между i и j; и число от 1 до 1000 - вес реба ij; 
    int w[size][size];
    int n,m,q,a,we;
    // инициализация массивов
    // сначала до всех вершин не известно расстояние поэтому 
    // бесконечность; u[] = false - нет вершин до которых расстояние 
    // известно
    for ( int i = 0; i < size; i++) {
        for ( int j = 0; j < size; j++) {
            d[i] = 49999999999999999;
            u[i] = false;
            w[i][j] = -1;
        }
    }
    // n - количество вершин; m - количество ребер; 
    // qa - ребро веса we;
    cin >> n >> m;
    for (int i = 0;i < m;i++) {
        cin >> q >> a >> we;
        w[q - 1][a - 1] = we;  // q-1 потому что массив от 0..n-1
    }
    // начало алгоритма
    int v = 0;
    d[v] = 0;
    while (v != -1) {
        u[v] = true;
        // релаксация
        for (int s = 0;s < size;s++) {
            if (w[v][s] != -1) {
                if (d[s] > d[v] + w[v][s])
                    d[s] = d[v] + w[v][s];
            }
        }
        // поиск минимума
        v = -1;
        for (int i = 0;i < size;i++) {
            if ((!u[i]) && ((v == -1)|| d[v] > d[i]))
                v = i;
        }
    }
    // вывод
    for (int i = 0;i < n;i++) {
        if (d[i] < 49999999999999999) cout << d[i] << " ";
        else cout << 1073741824 << " ";
    }
    return 0;
}
На 6 тесте Wrong Answer помогите пожалуйста..
DemonScorpion вне форума Ответить с цитированием
Старый 16.08.2010, 18:29   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Что такое
Цитата:
// релаксация
?
Открою маленький секрет - данный форум выпускает свой собственный журнал. Так вот, на сайте procoder.info имеется выпуск журнала в котором описывается алгоритм Дейкстры. Точно где-то был, потому что я автор той самой статьи . Там написано на Делфи, но расписано так, что при наличии определенной врожденной дозы серого вещества можно реализовать на любом языке программирования... А еще к статьям прилагаются ресурсы, а там код, и не просто абракадабра, а с комментариями... Если не получится, ну не знаю, но дело точно не в статье .

ЗЫ. Нравятся комментарии - человек который не ленится писать комментарии в программе, далеко пойдет...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 16.08.2010 в 18:34.
Utkin вне форума Ответить с цитированием
Старый 18.11.2015, 13:25   #3
Шамуэль
Новичок
Джуниор
 
Регистрация: 17.11.2015
Сообщений: 4
По умолчанию

Где я могу найти эту статью? подскажи пожалуйста хоть ссылку. Я изучаю данный алгоритм, и хочу увидеть код с комментариями, так как код без комментов трудно читабелен
Шамуэль вне форума Ответить с цитированием
Старый 18.11.2015, 15:25   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Что такое
Цитата:
Цитата:
// релаксация
?
Релаксация ребер - технический термин, означает перерасчет расстояния.
rrrFer вне форума Ответить с цитированием
Старый 18.11.2015, 18:41   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

А кто-нить ошибку-то видит? (да-да-да. дату видел)
Poma][a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм Дейкстры Opiym Общие вопросы .NET 1 29.05.2010 17:04
Алгоритм Дейкстры в xml LENA_M HTML и CSS 0 29.05.2010 04:36
Алгоритм Дейкстры tarnis Общие вопросы Delphi 4 11.05.2010 14:00
Алгоритм Дейкстры andis Помощь студентам 0 24.01.2010 17:42
Алгоритм Дейкстры Dimon88 Помощь студентам 2 03.11.2007 17:13