Страница 1 из 1

Help, переведите, пожалуйста

Добавлено: 12 май 2007, 18:03
ALLLEXXX
Люди добрые помогите пожалуйста, это текст проги на паскале, очень прошу перевести его на си, это задача, которая ищет точки сочленения в графе, или может у кого нибудь есть готовый код на си, помогите очень прошу!!!!!

program art_bridge_matrix;
{ Точки сочленения + Мосты, матрица смежности, O(M)}
{ Требования: неориентированный граф. Не обязательно связный }
{ Не допускается наличия нескольких ребер между одной и той же парой вершин! }
{ Отлаженна! }

{ low[v] - минимальное из: }
{ d[v], }
{ d[w], где (v,w) - обратное ребро, }
{ low[j], где w - потомок v в дереве поиски в глубину }

{ Если d[v] < low[w], где (v,w) - ребро, }
{ то (v,w) - мост }
{ Если d[v] <= low[w], где (v,w) - ребро, }
{ то (v,w) - точка сочленения }
{$APPTYPE CONSOLE}
uses
SysUtils;

const MaxN = 800;
var t: array[1..MaxN, 1..MaxN] of Boolean; { Граф - матрица смежности }
d: array[1..MaxN] of LongInt; { Время входа в вершину }
low: array[1..MaxN] of LongInt; { Наименьшое спец.значение вершины }
p: array[1..MaxN] of LongInt; { p - родитель i }
art: array[1..MaxN] of Boolean; { Точки сочленения }
bridge: array[1..MaxN, 1..MaxN] of Boolean; { Мосты }
count, x, y, i, j, N, M, col: LongInt;

procedure Init;
begin
Assign(input, 'input.txt'); Reset(input);

Read(N, M);

FillChar(t, sizeof(t), 0);
FillChar(d, sizeof(d), 0);
FillChar(low, sizeof(d), 0);
FillChar(p, sizeof(p), 0);
FillChar(bridge, sizeof(bridge), false);
FillChar(art, sizeof(art), false);

for i := 1 to M do
begin
Read(x, y);
t[x,y] := true;
t[y,x] := true;
end;

Close(input);
end;

procedure Save;
begin
Assign(output, 'output.txt'); ReWrite(output);

WriteLn('Мосты:');
for i := 1 to N do
for j := i+1 to N do
if bridge[i,j] then WriteLn(i,' ',j);

WriteLn('Точки сочленения:');
for i := 1 to N do
if art then WriteLn(i);

Close(output)
end;

function min(o1, o2: LongInt): LongInt;
begin
if o1 > o2 then min := o2 else min := o1
end;

procedure dfs(v: longInt);
var w: LongInt;
begin
inc(count);
d[v] := count;
low[v] := count;

for w := 1 to N do
if t[v, w] then
if d[w] = 0 then
begin
p[w] := v;
dfs(w);
low[v] := min(low[v], low[w]);
if d[v] < low[w] then begin bridge[v,w] := true;
bridge[w,v] := true; end;
if d[v] <= low[w] then art[v] := true;
end else
if p[v] <> w then
low[v] := min(low[v], d[w]);

end;

procedure art_bridge;
begin
count := 0;
for i := 1 to N do
if d = 0 then
begin
dfs(i);
col := 0;
for j := 1 to N do
if p[j] = i then inc(col);
if col <= 1 then art := false
else art := true;
end;
end;

begin
Init;
art_bridge;
Save;
end.



СПАСИБО