Вопрос № 177414: здравствуйте уважаемые эксперты хотела бы попросить вас описать код программы.В ней происходит выявление интервалов корня и нахождение корня интервала , прошу описать код...
Вопрос № 177415: Здравствуйте, уважаемые эксперты! Помогите, пожалуйста, с решением задач: 1)Реализовать поиск в глубину и в ширину в графе 2)Реализовать Эйлеров и Гамильтонов цикл в графе. 3)Найти в графе фундаментальное множество циклов минимального суммар...
Вопрос № 177416: Здравствуйте, уважаемые эксперты! Помогите, пожалуйста, с решением задач: 1. Реализовать алгоритм поиска кратчайших путей в графе: Волновой, Форда-Беллмана, Флойда, Дейкстры. Если возможно, с подробными объяснениями. Заранее огромное спасиб...
Вопрос № 177414:
здравствуйте уважаемые эксперты хотела бы попросить вас описать код программы.В ней происходит выявление интервалов корня и нахождение корня интервала , прошу описать код
Отвечает star9491, Студент :
Здравствуйте, luba tixomirova.
Посмотрите такой вариант:
Код:
uses crt;
var a,b,h,e:Real; x1,x2,x:Real; g:Text;
function Fun(x:Real):Real; begin Fun:=x*sin(x)-1; end;
function Root(x1,x2,e:Real):Real; var x:Real; begin
while (x2-x1)>=e do begin x:=(x1+x2)/2; if Fun(x1)*Fun(x)<0 then x2:=x else x1:=x; end; Root:=(x1+x2)/2; end;
begin a:=-40;b:=40;h:=0.1;e:=0.000001; x1:=a;x2:=a+h; Assign(g,'D:\Korny.txt'); Rewrite(g); ClrScr; while x2<=b do begin if Fun(x2)=0 then begin Writeln('Found x=',x2:6:2); Writeln(g,'Root=',x2:6:6); end else if
Fun(x1)*Fun(x2)<0 then begin Writeln('[',x1:6:2,';',x2:6:2,']'); x:=Root(x1,x2,e); Writeln(g,'Root=',x:6:6); end; x1:=x2; x2:=x2+h; end; Close(g); Readln; end.
Ответ отправил: star9491, Студент
Ответ отправлен: 24.03.2010, 23:13
Номер ответа: 260347
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 260347
на номер 1151 (Россия) |
Еще номера »
Вопрос № 177415:
Здравствуйте, уважаемые эксперты! Помогите, пожалуйста, с решением задач: 1)Реализовать поиск в глубину и в ширину в графе 2)Реализовать Эйлеров и Гамильтонов цикл в графе. 3)Найти в графе фундаментальное множество циклов минимального суммарного веса. Если возможно, с подробными объяснениями. Заранее огромное спасибо!
Отвечает vitalkise, 4-й класс :
Здравствуйте, Аня Ласточка. Поис в ширину - реализация на Паскале с использованием матрицы смежности
Код:
var Q:array[1..100] of byte; {очередь} left,right:byte; procedure Enqueue(x:word); {процедура добавления в очередь вершины} begin Q[right]:=x; if right=100
then right:=1 else inc(right); end;
procedure Dequeue; {процедура удаления из очереди вершины} begin if left=100 then left:=1 else inc(left); end; var G:array[1..100,1..100] of word; {граф} i,j,k,h:word; d:array[1..100] of word; {массив расстояний} p:array[1..100] of word; {массив предков} color:array[1..100] of byte; {массив цветов} n:word; fin:text; beg:word;
{начальная вершина} begin k:=0; {чтение графа из файла, имя которого - первый параметр командной строки} assign(fin,paramstr(1)); reset(fin); read(fin,n); readln(fin,beg); while not EOF(fin) do begin read(fin,i); readln(fin,j); g[i,j]:=1; g[j,i]:=1; end; close(fin); {конец чтения из файла} {инициализация массивов} for i:=1 to n do begin color[i]:=0; d[i]:=65535; p[i]:=0; end; {конец
инициализации массивов} color[beg]:=1; d[beg]:=0; p[beg]:=0; left:=1; right:=1; Enqueue(beg); {добавление первой вершины в очередь} while left<>right do {пока очередь не пуста} begin k:=Q[left]; for i:=1 to n do {для всех вершин...} if g[k,i]=1 then {...смежных с k...} begin if color[i] = 0 then {...если мы ее еще не обрабатывали...} begin
color[i]:=1; {...сделать цвет серым...} d[i]:=d[k]+1; {...указать расстояние...} p[i]:=k; {...указать предка...} EnQueue(i); {...добавить в очередь} end; end; Dequeue; {удалить из очереди} color[k]:=2; {сделать цвет черным: вершина полностью обработана} end; {вывод на экран расстояния от s до всех вершин, достигаемых из нее} for i:=1 to n do write(d[i],'
'); writeln; end.
Поиск в глубину
Код:
var fin:text; g:array[1..100,1..100] of word; {матрица смежности} N:word; d,f:array[1..100] of word; {массивы меток} p:array[1..100] of wo
rd; {массив предков} color:array[1..100] of byte; {массив цветов} time:word; {счетчик времени} procedure DFS_visit(u:word); var i,j:word; begin color[u]:=1; {"окрашиваем"вершину u в серый цвет} inc(time); d[u]:=time; for i:=1 to n do if g[u,i]=1 then {Если есть ребро из u в i...} if color[i]=0
then {... то если цвет i белый (мы ее еще не обрабатывали)...} begin p[i]:=u; {...предок i - v...} DFS_Visit(i); {...вызываем рекурсивно процедуру для вершины i} end; {после выполнения цикла мы гарантируем, что обработали
все смежные u необработанные вершины} color[u]:=2; {помечаем u как обработ
анную} inc(time); f[u]:=time; end; var i,j:word; begin {читаем информацию про граф из файла, заданного первым параметром командной строки} {граф задан так: первая строка файла - колличество вершин. В каждой следующей строке - два числа i и j. Это означает, что в графе существует ребро i->j} assign(fin,paramstr(1)); reset(fin); readln(fin,n); while not EOF(fin) do begin read(fin,i); readln(fin,j); g[i,j]:=1; end; close(fin); {граф
прочитан} {обнуляем массивы предков и цветов} for i:=1 to n do begin color[i]:=0; p[i]:=0; end; for i:=1 to n do if color[i]=0 then DFS_Visit(i); {в этот момент построенно дерево поиска, которое находится в массиве p, известно, на каком шаге каждая вершины вошла в поиск. Эту информацию можно использовать как данные для других алгоритмов} end.
Метод Эйлера
Код:
Program Metod_Eyler; { Алгоритм Эйлера} Uses Crt; Const Nmax=10; N_St=Nmax*(Nmax-1) div 2; Type A_array=array [1..Nmax,1..Nmax] of integer; Var A,A_Eiler : A_array; Stack : array [1..N_St] of integer; yk :integer; Procedure Init (var A:A_array); var F : text; Err,Ch,i,j : integer;
St , S : string; begin assign (F,'graf_2.txt'); reset (F); i:=1; FillChar (A,SizeOf(A),0); While not Eof(F) do begin ReadLn (F,St); for j:=1 to Nmax do begin if Pos (' ',St)=0 then Val (Copy(St,1,Length(St)),A[i,j],Err) else Val (Copy(St,1,Pos(' '
;,St)-1),A[i,j],Err); Delete (St,1,Pos (' ',St)); end; inc(i); end; Close (F); end; Procedure Find_Tree (var A_Eiler : A_array); var Sp : set of 1..Nmax; i,j,min,l,t : integer; begin min:=MaxInt; Sp:=[]; l:=0; t:=0; for i:=1 to Nmax-1 do for j:=i+1 to Nmax do if (A[i,j]<min) and (A[i,j]<>0) then begin min:=A[i,j];
l:=i; t:=j; end; A_Eiler[l,t]:=A[l,t]; A_Eiler[t,l]:=A[t,l]; Sp:=Sp+[l,t]; While Sp<>[1..Nmax] do begin min:=MaxInt; l:=0; t:=0; for i:=1 to Nmax do if i in Sp then for j:=1 to Nmax do if not (j in Sp) and (A[i,j]<min) and (A[i,j]<>0) then begin min:=A[i,j];
l:=i; t:=j; end; A_Eiler[l,t]:=A[l,t]; A_Eiler[t,l]:=A[t,l]; Sp:=Sp+[l,t]; end; end; Procedure Eiler_Way (v:integer); var j : integer; begin for j:=1 to Nmax do if A_Eiler[v,j]<>0 then begin A_Eiler[v,j]:=0; Eiler_Way (j); end; Inc (yk); Stack[yk]:=v; end; Procedure Solve; begin FillChar (A_Eiler,SizeOf(A_Eiler),0);
yk:=0; Find_Tree(A_Eiler); Eiler_Way (1); end; Procedure OutPut; var Way : set of 1..Nmax; i,pred_v : integer; Cost : integer; begin Write ('Путь -',Stack[1]:3); Cost:=0; Way:=[Stack[1]]; pred_v:=Stack[1]; for i:=2 to yk do if Not (Stack[i] in Way) then begin Write (Stack[i]:3); Way:=Way+[Stack[i]]; Cost:=Cost+A[pred_v,Stac
k[i]]; pred_v:=Stack[i]; end; WriteLn (Stack[1]:3); Cost:=Cost+A[pred_v,Stack[1]]; Writ
e ('Стоимость маршрута- ',Cost); end; Begin ClrScr; Init (A); Solve; OutPut; ReadLn; End.
Гамильтон
Код:
program HS; uses new_crt; type CM = array[1..100, 1..100] of integer; StArr = array[1..100] of
integer; NnewA = array[1..100] of boolean; var St: StArr; Nnew:NnewA; A: CM; i, N, M:integer; f: text; function ReadArr(S: string; var A: CM; var k: integer):boolean; var f: text; i, j, l: integer; c: integer; begin assign(f, S); reset(f); i:=1; j:=1; while not eof(f) do begin while not eoln(f) do begin read
(f, c); a[i, j]:=c; j:=j+1; end; i:=i+1; l:=j-1; j:=1; readln(f); end; close(f); k:=i-1; if (k=l) then ReadArr:=true else ReadArr:=false; end; procedure Gm(k: integer); var j,v: integer; f: text; i: integer; begin v:=St[k-1]; assign(f, 'output.txt'); rewrite(f); for j:=1 to N do begin write(A[v,j], ' ');
if (A[v,j]<>0) then begin if (k=N+1) and (j=1) then for i:=1 to k do write(f, St[i], ' '); end else if Nnew[j] then begin St[k]:=j; Nnew[j]:=false; writeln(f); Gm(k+1); Nnew[j]:=true; end; end; w
riteln; close(f); end; begin clrscr; if ReadArr('input.txt', A, N) then begin Writeln(N); St[1]:=1; Nnew[1]:=false; Gm(2); end; repeat until keypressed; end.
Перенесено из мини-форума по просьбе автора ответа
-----
∙ Отредактировал: Лысков Игорь Витальевич, Модератор
∙ Дата редактирования: 23.03.2010, 09:43 (время московское)
Ответ отправил: vitalkise, 4-й класс
Ответ отправлен: 23.03.2010, 06:43
Номер ответа: 260308
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 260308
на номер 1151 (Россия) |
Еще номера »
Вопрос № 177416:
Здравствуйте, уважаемые эксперты! Помогите, пожалуйста, с решением задач: 1. Реализовать алгоритм поиска кратчайших путей в графе: Волновой, Форда-Беллмана, Флойда, Дейкстры. Если возможно, с подробными объяснениями. Заранее огромное спасибо!
var ist,n:integer; c:array [1..maxn,1..maxn] of integer; dist:array [1..maxn] of integer;
{Ввод
данных. В файле 'graph.in' - число вершин графа n и матрица смежности c; c[i,j]=max, если дуги из i в j нет; предпологается, что max - некоторое число, много большее веса ребер графа; ist - номер вершины источника} procedure Init; var i,j:integer; begin assign (input,inp); reset (input); read (n); for i:=1 to n do for j:=1 to n do read (c[i,j]); read (ist); close (input) end;
function min(a,b:integer):
integer; begin if a<b then min:=a else min:=b end;
{Вычисление кратчайших путей} procedure FordBellman(ist:integer); var i,j,count:integer; begin for i:=1 to n do dist[i]:=c[ist,i]; count:=1; while count<n do begin for i:=1 to n do for j:=1 to n do dist[i]:=min(dist[i],dist[j]+c[j,i]); inc(count) end end;
{Вывод результата; i-ое число - кратчайшее расстояние от вершины ist до вершины i; если это число
равно max, пути нет} procedure PrintResult; var i:integer; begin assign (output,ou); rewrite (output); for i:=1 to n do write (dist[i],' '); close (output) end;
begin Init; FordBellman(ist); PrintResult end.
Алгоритм Флойда
Код:
Uses Crt,Graph,Graphs; Const M=19; {Предельное число вершин графа} R=200; {Радиус окружности на которой лежат вершины (центры окружностей)} Type Dmas = Array[1..M,1..M] Of Integer; Var N, {Число вершин графа} I,J, Nac, {Номер начальной вершины} Kon: Integer; {Номер конечной вершины} T, {Матрица, хранящая длины
путей} H, {Матрица, хранящая пути} C: Dmas; {Матрица, хранящая длины дуг}
Begin GotoXY(7,7); Write('Введите число вершин графа: '); Readln(N); {Задание значения числа вершин} If N>M Then Halt; {Если вершин больше чем константа M, то выход из программы} Clrscr; {Очистка экра
на} If N>5 Then {Автоматическое задание значений длин дуг} For I:=1 To N Do For J:=1 To N Do If I=J Then C[I,J]:=0 Else C[I,J]:=Random(100)+1 {Генерация текущего значения} Else Begin {Задание длин дуг вводом с клавиатуры} For I:=1 To N Do Begin Writeln; For J:=1 To N Do If I<>J Then Begin Write('Введите вес дуги [',I,',',J,']:=
'); Readln(C[I,J]) {Ввод с клавиатуры значения длины дуги} End Else If I=J Then C[I,J]:=0; End End; {Вывод полученной матрицы дуг} Clrscr; {Очистка экрана} Writeln('Матрица длин дуг'); Writeln; Write(' '); TextColor(Green); {Задание цвета текста} For I:=1 To N Do Write(' ',Chr(64+I)
,' '); Writeln; For I:=1 To N Do Begin TextColor(Green); {Задание цвета текста} Write(
39; ',Chr(64+I),' '); TextColor(White); {Задание цвета текста} For J:=1 To N Do Write(C[I,J]:3,' '); {Вывод текущего элемента матрицы} Writeln End; Readln {Задержка экрана} End;
Procedure Floid; {Процедура нахождения кратчайших путей и их длин}
Var I,J,K: Integer; Begin For I:=1 To N Do For J:=1 To N Do Begin T[I,J]:=C[I,J]; {Начальная
установка длин путей} If C[I,J]=100 Then H[I,J]:=0 {Нет дуги из вершины "I" в "J" вершину} Else H[I,J]:=J {Есть дуга из вершины "I" в "J" вершину} End; For I:=1 To N Do Begin For J:=1 To N Do For K:=1 To N Do If (I<>J) And (T[J,I]<>100) And (I<>K) And (T[I,K]<>100)
And ((T[J,K]=100) Or (T[J,K]>T[J,I]+T[I,K])) Then Begin H[J,K]:=I; {Запоминаем новый путь} T[J,K]:=T[J,I]+T[I,K] {Запоминаем длину данного нового пути} End; For J:=1 To N Do If T[J,J]<0 Then Break {Нет решения: вершина входит в цикл отрицательной длины} End; {Вывод полученной матрицы путей} Clrscr; {Очистка экрана} Writeln('Матрица путей'); Writeln;
Write(' '); TextColor(Green); {Задание цвета текста} For I:=1 To N Do Write(' ',Chr(64+I),' '); Writeln; For I:=1 To N Do Begin TextColor(Green); {Задание цвета текста} Write(' ',Chr(64+I),' '); TextColor(White); {Задание цвета текста} For J:=1 To N Do Write(H[I,J]:3,' '); {Вывод текущего элемента матрицы}
Writeln End; Readln; {Задержка экрана} {Вывод полученной матрицы длин путей} Clrscr; {Очистка экрана} Writeln('Матрица длин путей'); Writeln; Write(' '); TextColor(Green); {Задание цвета текста} For I:=1 To N Do Write(' ',Chr(64+I),' '); Writeln; For I:=1 To N Do Begin TextColor(Green); {Задание цвета текста} Write(' ',Chr(64+I),' ');
TextColor(White); {Задание цвета текста} For J:=1 To N Do Write(T[I,J]:3,' '); {Вывод текущего элемента матрицы} Writeln End; Readln; {Задержка экрана} Clrscr; {Очистка экрана} GotoXY(10,10); Write('Введите номер начальной вершины пути: '); Readln(Nac); GotoXY(10,12); Write('Введите номер конечной вершины пути: '); Readln(Kon); Writeln;
Write('Длина пути из вершины ',Chr(64+Nac),' в вершину ',Chr(64+Kon),' равна: ',T[Nac,Kon]); Readln {Задержка экрана} End;
Var Q,W: Real; K: Char; X1,X2,Y1,Y2, X: Integer; Begin Open_Graph; {Подключение графического режима} Q:=2*Pi/N; {Установка значения угла между границами сектора} {Задание координат вершин графа}
For I:=1 To N Do Begin W:=I*Q; {Установка текущего угла} {Установка координат} X1:=300+Trunc(R*cos(W)); Y1:=235+Trunc(R*sin(W)); X2:=300+Trunc((R+25)*cos(W)); Y2:=235+Trunc((R+25)*sin(W)); K:=Chr(64+I); {Задание текущего названия вершины} SetColor(White); {Задание цвета названий вершин} OutTextXY(X2,Y2,K); {Вывод названия вершины} SetColor(Green); {Задан
ие цвета вершины} For J:=1 To 7 Do Circle(X1,Y1,J) {Вывод концентрических окружностей для задания вершины на э
кране} End; {Вывод кратчайшего пути} X:=Nac; W:=Q*Nac; {Установка текущего угла} {Установка координат} X1:=300+Trunc(R*cos(W)); Y1:=235+Trunc(R*sin(W)); SetColor(Red); PutPixel(X1,Y1,Red); Repeat X:=H[X,Kon]; {Переход на следующую вершину в пути} W:=Q*X; {Установка текущего угла} {Установка координат} X2:=300+Trunc(R*cos(W)); Y2:=235+Trunc(R*sin(W));
Line(X1,Y1,X2,Y2); X1:=X2; Y1:=Y2 Until X=Kon; SetColor(White); OutTextXY(3,450,'Press any key, please...'); Readln; {Задержка экрана} Close_Graph; {Отключение графического режима} Clrscr End;
Begin
ClrScr; {Очистка экрана} TextBackGround(Black); {Задание цвета фона} TextColor(White); {Задание цвет
а текста} Clrscr; Dlina; {Задание длин дуг} Floid; {Поиск кратчайшего пути и его длины} Koordinata {Вывод найденных значений} End.
Алгоритм Дейкстры
Код:
const maxn = 100; infinity = maxlongint;
var
i,j,u,v,n,m,c,min,s,t:longint; e,w:array[1..maxn,1..maxn]of longint; ne,use,p,d:array[1..maxn]of longint;
begin read(n,m,t,s); for i:=1 to m do begin read(u,v,c); inc(ne[v]); e[v,ne[v]]:=u; //edges are inverted w[v,u]:=c; end; for i:=1 to n do d[i]:=infinity; d[s]:=0; for i:=1 to n do begin min:=infinity; for j:=1 to n do if (use[j]=0)and(d[j]<min) then begin min:=d[j]; u:=j;<
br> end; use[u]:=1; for j:=1 to ne[u] do begin v:=e[u,j]; if d[v]>d[u]+w[u,v] then begin d[v]:=d[u]+w[u,v]; p[v]:=u; end; end; end; writeln(d[t]); u:=t; write(u); while u<>s do begin u:=p[u]; write(' ',u); end; end.
----- От вопроса к ответу, от проблемы к решению
Ответ отправил: F®ost, Советник
Ответ отправлен: 23.03.2010, 11:36
Номер ответа: 260312 Беларусь, Минск Тел.: 375292792018 Организация: Минский Промтранспроект Адрес: ул. В.Хоружей, 13, г. Минск, Беларусь Адрес сайта:http://www.mptp.by
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 260312
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.