Cod sursa(job #583312)

Utilizator ion_calimanUAIC Ion Caliman ion_caliman Data 19 aprilie 2011 16:59:26
Problema Party Scor 30
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.45 kb
var     a,b:array[1..100] of boolean;
        m:array[1..100] of integer;
        v:array[1..3,1..1000] of longint;
        n,t,i,nr:longint;
        f,g:text;


procedure verificare;
var     i,x,y,z,s:longint;
        boo:boolean;
begin

  boo:=true;
  for i:=1 to t do
    begin
      x:=v[1,i]; y:=v[2,i]; z:=v[3,i];
      if z=0 then
        begin
          if not a[x] or not a[y] then
            begin
              boo:=false;
              break;
            end;
        end else
      if (z=1)or(z=2) then
        begin
          if not a[x] and a[y] then
            begin
              boo:=false;
              break;
            end
        end else
      if z=3 then
        begin
          if a[x] and a[y] then
            begin
              boo:=false;
              break;
            end;
        end;
    end;
  if boo then
    begin
      s:=0;
      for i:=1 to n do
        if a[i] then inc(s);
      if s>nr then
        begin
          nr:=s;
          b:=a;
        end;
    end;
end;

procedure party(p:longint);
var     x,y,z:longint;
begin
  if p>t then verificare
    else
  begin
  x:=v[1,p]; y:=v[2,p]; z:=v[3,p];
  if z=0 then
    begin
      a[x]:=true;
      a[y]:=true;
      m[x]:=1;
      m[y]:=1;
      party(p+1);
    end else
  if (z=1)or(z=2) then
    begin
      if a[x] then
        begin
          party(p+1);
          if m[y]=0 then
            begin
              a[y]:=not(a[y]);
              party(p+1);
            end;
        end else
        begin
          a[y]:=false;
          party(p+1);
        end;
    end else
  if z=3 then
    begin
      if not a[x] or not a[y] then
        party(p+1) else
        begin
          if m[x]=0 then
            begin
              a[x]:=false;
              party(p+1);
              if m[y]=0 then
                begin
                  a[x]:=true;
                  a[y]:=false;
                  party(p+1);
                  a[x]:=false;
                  party(p+1);
                end;
            end;
        end;
    end;
  end;
end;

begin
  assign(f,'party.in');
  assign(g,'party.out');
  reset(f);
  rewrite(g);
  readln(f,n,t);
  nr:=0;
  for i:=1 to t do
    readln(f,v[1,i],v[2,i],v[3,i]);
  for i:=1 to n do
    begin
      a[i]:=true;
      m[i]:=0;
    end;
  party(1);
  writeln(g,nr);
  for i:=1 to n do
    if b[i] then
      writeln(g,i);
  close(g);

end.