Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program Neighbours;
- const V = 100000;
- type
- (* StackNodePtr это указатель на StackNode. *)
- StackNodePtr = ^StackNode;
- (* StackNode тип который состоит из двух переменных. *)
- StackNode = record
- prev : StackNodePtr;
- value : Longint;
- end;
- var n, m, i, a, b : Longint;
- ptr : StackNodePtr;
- graph : array [1..V] of StackNodePtr; (* Голова (верхушка) стека *)
- (* Вставляет в верхушку стека новое число inbound. *
- * Возвращает новую верхушку стека. *)
- function Push(head : StackNodePtr; inbound : Longint) : StackNodePtr;
- var newb : StackNodePtr;
- begin
- new(newb); (* Выделяем память для нового элемента *)
- newb^.value := inbound; (* Заносим число *)
- newb^.prev := head; (* Делаем указатель на старую верхушку *)
- Push := newb; (* Теперь верхним элементом будет новый *)
- end;
- (* Берёт число из верхушки стека и возвращает его.
- * Не вызывайте эту функцию, если стек пуст! *)
- function Top(head : StackNodePtr) : longint;
- begin
- Top := head^.value; (* Просто берём число с верхушки *)
- end;
- (* Удаляет верхний элемент стека.
- * Возвращает новую верхушку стека.
- * Не вызывайте эту функцию, если стек пуст! *)
- function Pop(head : StackNodePtr) : StackNodePtr;
- begin
- Pop := head^.prev; (* Новая верхушка теперь по указателю prev. *)
- end;
- begin
- Readln(n, m);
- (* Зануляем граф. Вначале он пуст *)
- for i := 1 to n do begin
- graph[i] := nil;
- end;
- while m <> 0 do begin
- Dec(m);
- Readln(a, b); (* Читаем ребро *)
- (* Записываем, что вершина a связана с b и наоборот *)
- graph[a] := Push(graph[a], b);
- graph[b] := Push(graph[b], a);
- end;
- for i := 1 to n do begin
- a := 0; (* Зануляем счётчик соседей *)
- ptr := graph[i]; (* Берём первого соседа *)
- while ptr <> nil do begin (* Пока сосед существует ... *)
- Inc(a); (* Считаем его *)
- ptr := Pop(ptr); (* И переходим к следующему *)
- end;
- Writeln(a);
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment