1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Графы. Фундаментальная система циклов связного графа
Написала программу по псевдокоду...Но результат работы процедур не выдается....Не пойму в чем проблема...Пседокод прилагаю..заранее благодарю за помощь))
uses crt; const max=50; type TMatrix = array [1..max,1..max] of byte; TArray = array [1..max] of integer;
var i,j,m,k,z : integer; num,ftr,masQ: TArray; Matrix : TMatrix; {матрица смежности} n ,nz: integer; {количество вершин графа}
procedure save(i,j,nz:integer); begin z:=i; while z<>j do begin masQ[nz]:=z; z:=ftr[z]; masQ[nz]:=j; masq[nz]:=i; end; end; procedure cicle(i:integer); var j:integer;
begin k:=k+1; num[i]:=k; for j:=1 to n do begin if (Matrix[i, j]<>0) and (num[j]=0) then begin ftr[j]:=i; cicle(j); end else if ftr[i]<>j then begin nz:=nz+1; save(i,j,nz); end; end; end;
begin clrscr;
writeln('=======Фундаментальная система циклов связного графа====');
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; {$endif} //вывод матрицы смежностиж; writeln('Матрица смежности'); for i:=1 to n do begin for j:=1 to n do write(Matrix[i,j],' '); writeln; end; writeln;
writeln('Результат :'); n:=0; m:=0; for i:=1 to n do begin num[i]:=0; {ни одна вершина не посещалась} ftr[i]:=0; n:=n+1; m:=m+(n*n); m:= round(m / 2); k:=1; end; for i:=1 to m-n+1 do begin masQ[i]:=0; k:=0; nz:=0; cicle(i);
//вывод массивов num ftr; write('num: '); for i:=1 to n do write(num[i]:3); writeln; write('ftr: '); for i:=1 to n do write(ftr[i]:3); writeln; write('masQ: '); for i:=1 to n do write(masQ[i]:3); writeln; write('nz: '); write(nz); writeln; readln; end; end.
1. Обрати внимание, что в этой задаче граф предлагается задавать не матрицей смежности, а списками смежности. Соответственно при инициализации в цикле m:=m+n*n; - совсем ахинея, не считая ввода матрицы смежностей. Хотя подойдёт и матрица, но в методичке предлагается научиться работать со списками. 2. Кроме того, masQ - это не массив чисел, а массив стеков. И в процедуре SAVE операция masQ[nZ]<=i означает занесение числа i в вершину стека (стека под номером nZ в массиве стеков masQ), а не примитивное присвоение. Соответственно и вывод на экран из стека и массива стеков будет иным. 3. В SAVE строка с номером 5 вне тела цикла.
Внимательно прочти теорию.
Нечестно манипулировать форумчанами выдавая механический перевод псевдокода за попытку разобраться в теме. Хотя несомненно много лучше постановки задачи с последующим "разрешением" сделать всё "под ключ".
Предвидя вопрос о стеке... Стек можно реализовать в виде массива [0..max]. В [0] элементе будет храниться глубина стека, а начиная с 1-го элемента будет располагаться сам стек. Соответственно, массив стеков становится двумерным массивом. Занесение в стек номер nZ числа i будет
Inc(masQ[nZ][0]); x:=masQ[nZ][0]; masQ[nZ][x]:=i;
И лучше всего эти строки оформить процедурой.
Или же стек можно реализовать в виде динамической структуры.