图的支配集问题
来源:互联网 发布:2017网络洗脑神曲 编辑:程序博客网 时间:2024/09/21 09:01
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.