program test;
const
maxn = 100;
type
ghtype = array[1..maxn, 1..maxn] of integer;
settype = set of 1..maxn;
ltype = array[1..maxn] of settype;
var
g:ghtype;
n,l:integer;
f:text;
lt:ltype;
m:integer;
procedure init;
var
i,j:integer;
u,v:integer;
begin
fillchar(g, sizeof(g), 0);
for i := 1 to m do
begin
read(u, v);
g[u,v] := 1;
g[v,u] := 1;
end;
end;
procedure reduce(s:settype);
var
i, j:integer;
begin
i := 1;
while i <= l do
begin
if s * lt[i] = lt[i] then exit;
if s * lt[i] = s
then begin
for j := i + 1 to l do lt[j - 1] := lt[j];
dec(l)
end
else inc(i);
end;
inc(l);lt[l] := s;
end;
procedure think;
var
tl, i, j, k:integer;
t:ltype;
begin
l := 0;
for i := 1 to n do if (i = 1) or (g[1, i] > 0) then reduce([i]);
for i := 2 to n do
begin
t := lt; tl := l;
l := 0;
for j := 1 to n do
if (i = j) or (g[i,j] > 0)
then for k := 1 to tl do reduce(t[k] + [j]);
end;
lt := t; l := tl;
end;
procedure print;
var
i, j:integer;
min:integer;
count:integer;
begin
min := 40;
for i := 1 to l do
begin
count := 0;
for j := 1 to n do if j in lt[i] then inc(count);
if count < min then min := count;
end;
writeln(min);
end;
begin
{
assign(input, 'D:\UVa\uva_in.txt');
reset(input);}
read(n, m);
while (n <> 0) or(m <>0) do
begin
init;
think;
print;
read(n, m);
end;
{close(input);
}
end.
图的支配集问题
最新推荐文章于 2022-01-03 22:44:24 发布