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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2012, 16:21   #1
domovou
Пользователь
 
Аватар для domovou
 
Регистрация: 01.09.2012
Сообщений: 88
По умолчанию Граф.Заданы две системы двухсторонних дорог с одним и тем же множеством городов ...

Здравствуйте.
Вот сама задача:
заданы две системы двухсторонних дорог с одним и тем же
множеством городов (железные и шоссейные дороги).Найти минимальный по
длине путь из города А в горо В (который может проходить как по железным,
так и по шоссейным дорогам) и места пересадок с одного вида транспорта на другой на этом пути.


Код:
const MaxN = 50;
INF = 1000000000; {//"бесконечность"}

type Matrix = array[1..MaxN,1..MaxN] of longint; {//тип матрицы смежности. M[i,j] = true, если существует ребро,
идущее от вершины i к j }

var
A,A2 : Matrix;
N, S1, S2, N2,S11, S22: integer;
input, input2: text;

procedure Input_Table(var A : Matrix; N : longint; var T : Text); {//процедура ввода матрицы смежности A(N, N)
из текстового файла T }
var i, j : longint;
begin
    for i := 1 to N do
    begin
        for j := 1 to N do
        begin
            read(T, A[i, j]);
            if (a[i,j] = 0) and (i <> j) then a[i,j] := INF; {//вершины, которые не связаны ребром, будем обзначать
             "бесконечностью" ввиду ограничения на вес рёбер }
        end;
        readln(T);
    end;
end;



procedure Deikstr(s, s1 : integer); {//s, s1 - искомые вершины (необходимо найти путь от s до s1)}
var i, j, v, min, z : longint;
st, c : string;
visited : array[1..MaxN]of boolean; {//массив посещённости вершин}
D : array[1..MaxN] of longint; {//массив кратчайших расстояний }
P : array[1..MaxN] of integer; {//массив предков, который поможет определить маршрут. p[i] будет содержать
 предпоследнюю вершину кратчайшего маршрута от s до i}
begin
    for i := 1 to N do
    begin
        p[i] := s;
        visited[i] := FALSE;
    end;
    visited[s] := TRUE; {//вершина S посещена}

    for i := 1 to N do D[i] := A[s, i]; {//изначальный массив расстояний }
    D[s] := 0;

    p[s] := 0;

    for i := 1 to N-1 do {//на каждом шаге находим минимальное решение и пытаемся его улучшить}
    begin
        min := INF;
        for j := 1 to N do if (not visited[j]) and (D[j] < min) then
        begin
            min := D[j]; {//минимальное расстояние }
            v := j;{ //найденная вершина}
        end;
        for j := 1 to N do if (D[j] > D[v] + A[v, j]) and (D[v] < INF) and (A[v, j] < INF) then
        begin
            D[j] := D[v] + A[v, j]; {//пытаемся улучшить решение. Если в ней расстояние больше, чем сумма расстояния до текущей
             вершины и длины ребра, то уменьшаем его.}
            p[j] := v;
        end;
        s := v; {//новая текущая вершина  }
        visited[v] := TRUE; {//и она отмечается посещенной}
    end;

    st := ''; {//осталось преобразовать в формат вывода (мы проидёмся по всем вершинам кратчайшего пути от s до s1, но только в
     обратном порядке) }
    z := p[s1]; {//пока есть корневая вершина }
    while z <> 0 do
    begin
        str(z,c);
        st := c + '->' + st; {//заносим в маршрут }
        z := p[z]; {//переходим к следующей вершине}
    end;
    str(s1,c); {//в маршрут записываем начальную вершину}
    st := st + c;
    writeln(st);
end;

BEGIN
    assign(input,'input.txt');
    reset(input);
    readln(input, N, S1, S2);
    Input_Table(A, N, input);
    close(input);
    Deikstr(S1, S2);



END.
Я понял как найти мин расстояния из города А в город В, но как это сделать с двумя дорогами(шосейная и железная) не понимаю.
Заранее спасибо.
Вложения
Тип файла: txt input.txt (62 байт, 124 просмотров)
Программист - это не тот, кто пишет программы, а тот, чьи программы работают.
domovou вне форума Ответить с цитированием
Старый 20.11.2012, 17:36   #2
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

как тебе идея сперва объединить эти 2 дороги, и смотреть как одну, без всяких маниокальных изощрений... и потом уже при выбраном коротком пути, смотреть с какой дороги на какую переходишь (повторный анализ файла на основе выбранного пути).
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заданы две матрицы casper116 Помощь студентам 2 05.01.2011 23:56
заданы z и у - две последовательности чисел. Можно ли получить последовательность z путем вычеркивания эл alykaa Помощь студентам 11 05.12.2010 21:10
как в цикле создавать массив с одним и тем же именем!?ошибка в ходе выполнения -access violation at addr sleevman Помощь студентам 2 28.10.2009 19:06
Заданы две матрицы A3х3 и B4х4. Построить таблицу функций y=cx2+d при x є [0; 1] с шагом ∆х=0,1 moto74 Паскаль, Turbo Pascal, PascalABC.NET 17 06.04.2009 17:13
Проблемы с одним клиентом и множеством серверов Maxxon Работа с сетью в Delphi 5 28.08.2007 17:27