Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2009, 15:49   #1
Witaliy
Форумчанин Подтвердите свой е-майл
 
Регистрация: 27.04.2008
Сообщений: 179
По умолчанию Задача (на графы)

Всем привет
Возникла такая задача:
В классе Петрика все дети очень дружные. Среди учеников этого класса выполняется такое правило - друг моего друга мой друг. Также, если Петрик дружит с Андрейком, то Андрейко не обязательно дружит с Петриком. Учительница знает, что некоторые дети дружат, но обо всех она не знает. Все же учительнице хочется узнать, насколько у нее дружеский класс. Для этого Вам нужно определить, сколько существует упорядоченных пар друзей в этом классе (ученики сами с собой не дружат).
1<=N<=500
1<=N<=5000
Вход. Диние:
N-количество учеников в классе, M - количество пар, о которых учительнийца знает, что они дружат. В следующий М рядках указаны ети пары. Все ученики пронумерованние от 1 до N
Вых. Дание:
Количество дружных пар учеников.
Например

2 3
1 2
2 3

Результат: 3

Тепер моя точка зрения для примера: количество пар всегда будет больше за N. Для примера будут такие варианты: (1,2) (2,3) и (1,3), бо 3 друг друга 1
Как я понял, задачю надо решать на графы, но не знаю как.

Благадарен за любую помошь.
Спасибо.

(за русский извините, я ученик с Украины)
www.programmer.uaforums.net - Український форум програмістів.

www.satellite.ipsys.net - Український форум супутникового телебачення.
Witaliy вне форума Ответить с цитированием
Старый 14.02.2009, 16:32   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Сразу оговорюсь, что с графами знаком плохо.
Вроде работает.
Код:
uses crt;
var
M,N,i,j,a,b : integer;
cnt : integer;
matr : array[1..5000,1..5000] of boolean;

procedure rec(ti : integer; ci : integer);
 var i : integer;
 begin
 { -- здесь была ненужная строчка -- }

 for i:=1 to N do
  if i=ti then continue
  else if i=ci then continue
  else
   begin
   if matr[ci,i]=true then
    begin
     if matr[ti,i] = false then
      begin
      matr[ti,i] := true;
      rec(ti,i);
      end;
    end;

   end;

 end;

begin
clrscr;
readln(M,N);
for i:=1 to N do
 for j:=1 to N do
  matr[i,j] := false;

for i:=1 to M do
 begin
 readln(a,b);
 matr[a,b] := true;
 end;
{--------}
cnt := 0;
for i:=1 to N do
 for j:=1 to N do
  if matr[i,j] = true then
   rec(i,j);
{--------}
for i:=1 to N do
 for j:=1 to N do
  if matr[i,j] = true then inc(cnt);
writeln(cnt);
readln;
end.
Проверил на:
Код:
2 3
1 2
2 3
Результат 3.
И на
Код:
4 5
1 2
2 4
4 3
3 5
Результат 10.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 14.02.2009 в 16:52. Причина: удалил лишнюю строчку
Sazary вне форума Ответить с цитированием
Старый 14.02.2009, 16:36   #3
Witaliy
Форумчанин Подтвердите свой е-майл
 
Регистрация: 27.04.2008
Сообщений: 179
По умолчанию

Очень большое спасибо, а как назыветься такой алгоритм?
www.programmer.uaforums.net - Український форум програмістів.

www.satellite.ipsys.net - Український форум супутникового телебачення.
Witaliy вне форума Ответить с цитированием
Старый 14.02.2009, 16:42   #4
Witaliy
Форумчанин Подтвердите свой е-майл
 
Регистрация: 27.04.2008
Сообщений: 179
По умолчанию

Извините, моя ошыбка:
Например

3 2
1 2
2 3
www.programmer.uaforums.net - Український форум програмістів.

www.satellite.ipsys.net - Український форум супутникового телебачення.
Witaliy вне форума Ответить с цитированием
Старый 14.02.2009, 16:47   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Witaliy
Очень большое спасибо, а как назыветься такой алгоритм?
Я не использовал готовый алгоритм (а если так и получилось, то это совпадение ).
Цитата:
Извините, моя ошыбка:
Например

3 2
1 2
2 3
Первое число в первой строке - M, второе - N.
Далее идут M строк (пары, о которых известно)
То, что вы сейчас привели, под эти критерии не подходит )

----
Если нужно, могу описать логику работы (вроде как, там и так все понятно, но, может быть, это только для меня ))
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 14.02.2009 в 16:51.
Sazary вне форума Ответить с цитированием
Старый 14.02.2009, 17:22   #6
Witaliy
Форумчанин Подтвердите свой е-майл
 
Регистрация: 27.04.2008
Сообщений: 179
По умолчанию

было б хорошо.
www.programmer.uaforums.net - Український форум програмістів.

www.satellite.ipsys.net - Український форум супутникового телебачення.
Witaliy вне форума Ответить с цитированием
Старый 14.02.2009, 17:47   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Сначала читаем M (количество известных пар) и N (количество учеников).
Код:
readln(M,N);
Далее забиваем матрицу смежности нулями (т.к. каждый элемент может находиться только в одном состоянии (дружит/не дружит), то используем тип boolean), то есть false'ами.
Код:
for i:=1 to N do
 for j:=1 to N do
  matr[i,j] := false;
Потом считываем строки (пары) и пишем в матрицу:
Код:
for i:=1 to M do
 begin
 readln(a,b);
 matr[a,b] := true;
 end;
Число пар (общее) пока равно 0:
Код:
cnt := 0;
Далее запускаем цикл, который идет по строкам (то есть по каждому ученику):
Код:
for i:=1 to N do
 for j:=1 to N do
  if matr[i,j] = true then
   rec(i,j);
Вложенный цикл смотрит, дружит ли ученик j с учеником i. Если дружит, то нужно проверить с кем дружит ученик j. ДЛя этого вызываем процедуру rec(ti : integer; ci : integer).
ti - ученик, для которого мы ищем друзей (по принципу "друг моего друга - мой друг").
ci - текущий друг в цепочке.

Процедура:

Запускаем цикл, который обходит всех учеников:
Код:
for i:=1 to N do
Если наткнулись на исходного ученика - пропускаем:
Код:
if i=ti then continue
Если на себя (текущего) - тоже:
Код:
else if i=ci then continue
иначе:
Если текущий (в этом цикле) ученик дружит с текущим (из вне) другом исходного ученика:
Код:
if matr[ci,i]=true then
и если он еще не дружит с исходным учеником (ti):
Код:
if matr[ti,i] = false then
то отмечаем дружбу:
Код:
matr[ti,i] := true;
и рекурсивно вызываем себя, уже относительно нового текущего друга (исходный ученик тот же):
Код:
rec(ti,i);
----------
Когда обошли всех и вся, возвращаемся в программу. Там уже обходим всех учеников и по матрице смежности смотрим кто с кем дружит (и плюсуем cnt):
Код:
for i:=1 to N do
 for j:=1 to N do
  if matr[i,j] = true then inc(cnt);
Очень надеюсь, что понятно объяснил )
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 14.02.2009 в 18:10. Причина: опечатка
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Графы Prisian Общие вопросы Delphi 11 02.05.2013 22:02
графы на Delphi UMmi Общие вопросы Delphi 12 26.02.2011 14:14
Графы, матрица смежности. SteRN89 Помощь студентам 1 14.01.2009 08:11