Помощь - Поиск - Пользователи - Календарь
Полная версия: Графы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Юлия92
1)Добрый день люди есть псевдокод методичка Земленухина по которому не все понимаю.Непонятны в описании на паскаль..7 и 10 строки...помогите кто чем может)))

1.	for iX do num[i]:=0; ftr[i]:=0
2.	for i=1 to m do numBL[i]:=0
3.	k:=1; kU:=0;  SU:=nil; cntBL:=0; U:=nil;
4.	for rX 
5.	         do    if  num[r]=0  
6.	                                then   BLOCK(r)

BLOCK(i)
1.	num[i]:=k; L[i]:=k k:=k+1
2.	for   jГ[i]  
3.	         do    if  num[j]=0  
4.	                         then  SU (i,j)
5.	                                  ftr[j]:=i
6.	                                  BLOCK(j)
7.	                                  L[i]:=min(L[i],L[j])
8.	                                  if L[j]  num[i]  
9.	                                             then cntBL:=cntBL+1
10.	                                                      while Top(SU)  (i,j) 
11.	                                                                     do u  SU ; U  u                                                                                                                                        
12.	                                                                           kU:=kU+1
13.	                                                                           numBL[kU]:=cntBL
14.	                          else   if  j  ftr[i]
15.	                                               then  SU (i,j)
16.	                                                         L[i]:=min(L[i],num[j])

2)Применение Пвш...Надо найти экцентриситет (максимальный num) радиус(min num)диаметр(максимальный экцетриситет),а как найти матрицу расстояний и диаметральную цепь??? и как это все всунуть в пвш???
-Федосеев Павел-
Землячка,
- в 7 строке функция min, я не думаю что это проблема;
- в 10 строке самописная функция Top(SU) - значение объекта с вершины стека SU.

В процедурах используются два стека SU и u. Покажи как ты их реализовала (структура, Push, Pop) и на основании этого можно реализовывать Top. Кстати, обрати внимание, что в стек помещаются объекты - дуги графа - характеризуемые двумя числами (начало и конец).
Также в строке 10 нужно реализовать сравнение этих дуг - это лучше реализовать отдельной функцией.

В общем, всё упирается в твою реализацию. Приводи код.

P.S. Поищи эту методичку в сети - в электронном виде исправлены некоторые неточности и ошибки. В частности в строке 14 условие несколько сложнее. И ещё, просто из любопытства - методичка Земленухина или Землянухиной?

По второму вопросу мне нечего сказать.
Юлия92
Землячка?)))методичка Землянухины(авторы мужчина и женщина)))).А на лекции нам вообще давали другой малец код,(там вообще нет функцииTOP)Вот то на что меня хватило по реализациии(((...как обычно не густо....но очень очень надо сделать эту лабу (((сижу и мучаюсь
uses crt;
const
  max=50;
type
  TMatrix = array [1..max,1..max] of byte;
  TArray  = array [1..max] of integer;

var
  i,j,r,k,cntBL: integer;
  num, ftr,L,Su      : TArray;
  Matrix : TMatrix; 
  n    : integer; 

function min(a,b:integer):integer;
begin
if a>b then min:=b
else
min:=a;
end;

procedure Blok(r:integer);
var
  j:integer;

begin
  num[r]:=k;
  L[r]:=k;
  k:=k+1;

  for j:=1 to n do
  begin
    if (Matrix[r, j]<>0) and (num[j]=0) then
    begin
      Su[k]:=Matrix[r,j];
      ftr[j]:=r;
      Blok(j);
    end;
  end;
  L[r]:=min(L[r],L[j]);
                       if L[j]>=num[r] then
                        begin
                       cntBl:=cntBl+1
                       end
                       else
                        if j<>ftr[r] then
                       L[r]:=min(L[i],num[j])
end;

begin
  clrscr;

  writeln('----Mosti,Bloki,tochki razdela-----');

  write('а:');
  readln(n);

  writeln('Заполнение матрицы смежности');
  for i:=1 to n do
    for j:=1 to n do
    begin
      Write('(',i,',',j,')=');
      read(Matrix[i,j]);
      if Matrix[i,j] <> 0 then Matrix[i,j]:=1;
    end;

  writeln('Матрица смежности');
  for i:=1 to n do
  begin
    for j:=1 to n do
      write(Matrix[i,j],' ');
    writeln;
  end;
  writeln;


  writeln('Результат :');
  for i:=1 to n do
  begin
    num[i]:=0; {ни одна вершина не посещалась}
    ftr[i]:=0;
     end;
    k:=1;
    cntBl:=0;
    {U:=0;}


  for r:=1 to n do
    if num[r]=0 then Blok( r );

  


  writeln;
  readln;
end.

Нажмите для просмотра прикрепленного файла
Федосеев Павел
Пообещай не строить самолёты и атомные станции !mol1.gif !!!!!!!

Удивительно, но несмотря на название алгоритма в методичке, он не даёт в ответе именно мосты и точки раздела, а только блоки.

Мосты можно получить при проверке в BLOCK условия (L[j]>num[r]) {добавленная строка 7.1}.

Точки раздела получаются ниже при проверке (L[j]>=num[r]) {строка 8}. Но это действительно для всех вершин кроме корневой. В методичке что-то об этом есть.

Можешь "малец" почитать по теме на "http://e-maxx.ru/algo/" или погуглив.

По-хорошему, работу со стеком и со списком нужно вынести во внешний модуль - вспомогательные процедуры занимают слишком много места в тексте.

И ещё раз - не проектировать никаких подводных лодок, никаких самолётов... Ничего... lol.gif
Юлия92
Паш спасибо огромное....только почему то ошибка и в одном и другом файле в строке объявления function StackTop...34 (invalid function result type),т.е не верный тип возвращаемого значения функции и так во всех функциях(((((( так что даже если захочу построить самолеты не получится blink.gif
IUnknown
Цитата
только почему то ошибка и в одном и другом файле в строке объявления function StackTop...34 (invalid function result type),т.е не верный тип возвращаемого значения функции
Турбо-Паскаль что-ли используешь? Тогда да, там нельзя возвращать из функции ничего кроме встроенных типов данных. Никаких структур. Придется переделывать функции на процедуры:

procedure StackTop(const Stack : TStackEdge; var Res : TEdge);
begin
  Res:=Stack.Storage[Stack.Depth];
end;

, и все в таком духе. Ну, и вызовы функций, разумеется, переделывать... matrix.pas я приложил (компилируется, на работоспособность не проверял), второй файл - по аналогии измени.
Юлия92
Спасибо за помощь все понятно)))разобралась
Федосеев Павел
И хорошо!

В какой-то предыдущей теме с графами в коде были комментарии "//" - в стиле Delphi/FPC. Отсюда и моя уверенность в допустимости такой конструкции.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.