Здравствуйте, возможно, вопрос немного глупый, но все же... Недавно я решил попробывать решить задачу по нахождению количества компонентов связности в графе, а потом уже сколько нужно ребер чтобы связать этот граф. Данную задачу я пробывал решать методом непересекающихся множеств. Вот реализация на 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 — количество вершин,К — количество ребер графа)
Тесты не могут повлиять на этап компиляции.
Господа минусующие, вы все слишком стары для меня.
При чем здесь ошибка компиляции? Ошибка компиляции — это когда не удается создать exe-шник программы, например если в коде точку с запятой не поставить или скобку не закрыть. И тесты никак не связаны с ошибкой компиляции, потому что запускать на этих тестах будет нечего.
Эта программа почти правильная: ответ равен не r - 1, а r, а в остальном вроде все нормально
Ответ r-1 потому, что я вывожу сколько нужно ребер, чтобы граф стал связным...А в реальной здаче так как вы говорите...
Эта программа почти правильная: ответ равен не r - 1, а r, а в остальном вроде все нормально Исправил условие...
Точнее ошибку исполнения...
Например, при
N > 100001
1<=N<=100000, 1<=st,e<=N
С какого текущего соревнования эта задача?
На Codeforces есть примерно такая задача: http://mirror.codeforces.com/contest/25/problem/D . Можно попробовать её сдать.
Проблема решена, спасиба Gassa. Тема закрыта.