图的支配集问题

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值