Блог пользователя Crysis

Автор Crysis, 12 лет назад, По-русски

Здравствуйте, возможно, вопрос немного глупый, но все же... Недавно я решил попробывать решить задачу по нахождению количества компонентов связности в графе, а потом уже сколько нужно ребер чтобы связать этот граф. Данную задачу я пробывал решать методом непересекающихся множеств. Вот реализация на Delphi(з книги "Алгоритмы: построение и анализ" Т.Кормен и др.):

program Project2;

{$APPTYPE CONSOLE}

var
     f:text;
     n,k,i,st,e,r:integer;
     p,rank:array[1..100000] of integer;

      procedure link(x,y:integer);
     begin
     if (rank[y]>rank[x]) then p[y]:=x else  p[x]:=y;
     if (rank[y]=rank[x]) then inc(rank[y]);
     end;

      function find_set(x:integer):integer;
     begin
        if (x<>p[x]) then p[x]:=find_set(p[x]);
        find_set:=p[x];
     end;

     procedure union(x,y:integer);
     begin
    link(find_set(x),find_set(y));
     end;

begin
assign(f,'input.txt');
reset(f);
readln(f,n,k);
fillchar(rank,n,0);
for i:=1 to n do p[i]:=i;

for i:=1 to k do
begin
readln(f,st,e);
union(st,e);
end;

close(f);
r:=0;
for i:=1 to n do
begin
if (p[i]=i) then r:=r+1;
end;
 assign(f,'output.txt');
 rewrite(f);
 writeln(f,r-1);
 close(f);
end.  

Вот вторая реализация на Delphi(з сайта e-maxx.ru):

program Project2;

{$APPTYPE CONSOLE}
{$N+,R-}
uses SySUtils;

var
  f:text;
   n,k,s,i,st,e,r,a,b:integer;
 p,rank:array[0..100001] of integer;


  function find_set(x:integer):integer;
 begin
    if (x<>p[x]) then p[x]:=find_set(p[x]);
    find_set:=p[x];
 end;

 procedure union(x,y:integer);

  procedure swap(var a,b:integer);
  var
  c:integer;
  begin
  c:=a;
  a:=b;
  b:=c;
  end;

 begin
 a:=find_set(x);
 b:=find_set(y);
 if (a<>b) then
 begin
 if (rank[b]>rank[a]) then swap(a,b); p[b]:=a;
 if (rank[b]=rank[a]) then rank[b]:=rank[b]+1;
 end;

 end;



begin
readln(n,k);
for i:=1 to n do begin p[i]:=i; rank[i]:=0;   end;

for i:=1 to k do
begin
readln(st,e);
union(st,e);
end;


r:=0;
for i:=1 to n do
begin
if (p[i]=i) then r:=r+1;
end;

writeln(r-1);
readln;
end. 

Вопрос: есть ли тесты, при которых программа выдаст ошибку исполнения?(N — количество вершин,К — количество ребер графа)

  • Проголосовать: нравится
  • -17
  • Проголосовать: не нравится

»
12 лет назад, # |
  Проголосовать: нравится -6 Проголосовать: не нравится

есть ли тесты, при которых программа выдаст ошибку компиляции?

Тесты не могут повлиять на этап компиляции.

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +6 Проголосовать: не нравится

    Господа минусующие, вы все слишком стары для меня.

»
12 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится

При чем здесь ошибка компиляции? Ошибка компиляции — это когда не удается создать exe-шник программы, например если в коде точку с запятой не поставить или скобку не закрыть. И тесты никак не связаны с ошибкой компиляции, потому что запускать на этих тестах будет нечего.

Эта программа почти правильная: ответ равен не r - 1, а r, а в остальном вроде все нормально

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Ответ r-1 потому, что я вывожу сколько нужно ребер, чтобы граф стал связным...А в реальной здаче так как вы говорите...

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Эта программа почти правильная: ответ равен не r - 1, а r, а в остальном вроде все нормально Исправил условие...

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Точнее ошибку исполнения...

»
12 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
  1. С какого текущего соревнования эта задача?

  2. На Codeforces есть примерно такая задача: http://mirror.codeforces.com/contest/25/problem/D . Можно попробовать её сдать.

»
12 лет назад, # |
  Проголосовать: нравится -8 Проголосовать: не нравится

Проблема решена, спасиба Gassa. Тема закрыта.