图的支配集问题

来源:互联网 发布: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.