Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 09.03.2015
Сообщений: 1
1

Поиск в графе в ширину заданном списками инциденций

09.03.2015, 23:47. Показов 726. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Пытаюсь написать функцию поиска в ширину в графе, заданным списками инциденций.
Работает не правильно, пропускает вершины. Помогите пожалуйста разобраться с программой.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
program LAB7;
 
//uses crt;
 
type
  TList = ^pList;
  pList = record
    data: integer;
    next: TList;
  end;
  
  TGraph = ^pGpaph;
  pGpaph = record
    data: integer;
    head :TList; {Начало списка инцидеции}
    incList: TList; 
    next: TGraph;
  end;
  
  TQueue = ^pQueue; {Тип очереди}
  pQueue = record  
     head: TGraph;
     next: TQueue;
 end;
 
var
  rootVrt, Vrt: TGraph;
  vcount: integer;
 
procedure insVertex(var vrt: TGraph; data: integer);
var
  nextVrt: TGraph;
begin
  if vrt = nil then
  begin
    new(rootVrt);
    rootVrt^.data := 1;
    rootVrt^.head := nil;
    rootVrt^.incList := nil; 
    rootVrt^.next := nil;
    vrt := rootVrt;
  end
      else
  begin
    new(nextVrt);
    nextVrt^.data := data; 
    nextVrt^.head := nil;
    nextVrt^.incList := nil;
    vrt^.next := nextVrt;
    vrt := nextVrt;
  end;
end;
 
procedure insRelated(var pVrt: TGraph; data: integer);
var
   newLst, nextLst: TList;
begin
    if pVrt^.incList = nil then
      begin
        new(newLst);
        newLst^.data := data;
        newLst^.next := nil;
        pVrt^.incList := newLst;
        pVrt^.head := newLst; {Запоминаем начало списка инциденции}
      end
         else
      begin
        new(nextLst);
        nextLst^.data := data;
        nextLst^.next  := nil;
        pVrt^.incList^.next := nextLst;
        pVrt^.incList := nextLst;
      end;
end;
 
 
procedure CreateIncedentList(pVrt: TGraph);
var
  i, j, v, s: integer;
begin
  write('Введите количество вершин: ');
  read(vcount);
  for i := 1 to vcount do
    begin
      insVertex(pVrt, i);
      write('Введите количество ребер вершины ', i, ': ');
      ReadLn(v);
        for j := 1 to v do
          begin
            write('Введите смежную вершину ', j, ': ');
            ReadLn(s);
            insRelated(pVrt, s);
          end;
    end;
end;
 
procedure printGraph;
var
 v:TGraph;
 begin
  v := rootVrt;
  while v <> nil do
     begin
        WriteLn(v^.data);
        v^.incList := v^.head;
 
         while v^.incList <> nil do
            begin
               WriteLn('  ', v^.incList^.data);
               v^.incList := v^.incList^.next;
            end;
          v := v^.next;
     end;
end;
 
 
procedure pushQueue(var q: TQueue; gr:TGraph);
var
   p: TQueue;
begin
     if q = nil then {Создаем новую очередь}
       begin
          new(p);
          p^.head := gr;
          p^.next := nil;
          q := p;
       end
          else {Добавляем в существующую очередь}
       begin
          new(p);
          p^.head := gr;
          p^.next := nil;
          q^.next := p;
          q := p;
        end;
end;
 
 
function popQueue(var q: TQueue): TGraph;
var
   p: TQueue;
begin
   p := q;
   q := p^.next;
   popQueue := p^.head;
   dispose(p);
end;
 
function getVertexLink(num :integer) :TGraph;
  var
   zv :TGraph;
begin
  zv := rootVrt;
  while zv <> nil do
    begin
      if zv^.data = num then
        begin
          getVertexLink := zv;
          exit;
        end;
        zv := zv^.next;
    end;
end;
 
 
procedure setListHead;
  var
   zv :TGraph;
begin
  zv := rootVrt;
  while zv <> nil do
    begin
      zv^.incList := zv^.head;
      zv := zv^.next;
    end;
end;
 
 
procedure BFS(Vr :TGraph);
var
  visited :array[1..100] of boolean;
  queue :TQueue;
  pVr, pTmp :TGraph;
  pLs :TList;
  i :integer;
begin
  queue := nil;
  for i := 1 to 100 do visited[i] := true; {Отмечаем все вершины как не посещенные}  
  pVr := rootVrt;
  pushQueue(queue, pVr);
  visited[pVr^.data] := false;
  
  while queue <> nil do
    begin
       pVr := popQueue(queue);
       WriteLn('Вершина ', pVr^.data, ' посещена');
       pVr^.incList := pVr^.head;
       pLs := pVr^.incList;
       while pLs <> nil do
          begin
             if visited[pLs^.data] then {Если вершина не посещена}
                begin
                    pTmp := getVertexLink(pLs^.data); {Определяем ссылку вершины по номеру}
                    pushQueue(queue, pTmp); {Помещаем в очередь}
                    visited[pLs^.data] := false; {Отмечаем что посещена}
                 end;
                pLs := pLs^.next; 
           end;
    end;
end;
 
{Основная программа}
begin
  //clrscr;
  rootVrt := nil;
  Vrt := nil;
 
  writeln('Ввод списков инциденции:');
  CreateIncedentList(Vrt); 
  printGraph;
  writeln('Поиск в ширину:');
  setListHead;
  BFS(Vrt);
  
  WriteLn('Для выхода нажмите любую клавишу...');
  //repeat until KeyPressed;  
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2015, 23:47
Ответы с готовыми решениями:

Процедура поиска в глубину в графе, заданном списками инцидентности
Нужна помощь знающего Паскаль человека, по заданию: Напишите и используйте в программе процедуру...

Поиск в ширину в графе
Может быть вопрос слегка глупый. Но можно ли приравнять алгоритм &quot;Поиск в ширину&quot; к обычному...

Поиск в ширину на графе
#include &quot;stdafx.h&quot; #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; ...

Поиск в ширину в графе
Здравствуйте. Помогмте, пожалуйста! Суть в чем: В неориентированном графе требуется найти...

1
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
11.03.2015, 01:45 2
Если ещё актуально и несложно - преобразуй ввод с клавиатуры на ввод из файла (другая процедура ввода) и приведи новый исходник и сам тестовый файл.
0
11.03.2015, 01:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.03.2015, 01:45
Помогаю со студенческими работами здесь

Поиск в ширину в графе
У меня есть небольшая база данных(обычный текстовый файл). Парсирую этот файл и полчается список...

Поиск в ширину, глубину в графе
Есть ли у кого программка для поиска в ширину/в глубину на графах с использованием матрицы...

Поиск в ширину по матрице в графе
Доброго времени суток, пожалуйста помогите в написании поиска в ширину по матрице в графе.

Реализовать поиск в ширину в простом графе
Поиск в ширину--2 (вершины идентифицируются названиями) ограничение по времени на тест: 2...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru