Cod sursa(job #1217489)

Utilizator RusuAlexeiRusu Alexei RusuAlexei Data 7 august 2014 15:39:27
Problema Critice Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 5.99 kb
program pisici;
  type lista=^celula;
       celula=record
                info:longint;
                next:lista;
              end;
  var n,m,i,z,min,ans,f:longint;
      x,y:array[1..10000] of longint;
      a:array[1..1000] of lista;
      coada,v,q,r:lista;
      c:array[1..1000,1..1000]of longint;
      cr,cr2:array[1..1000,1..1000]of byte;
      from:array[1..1000] of longint;
      vis:array[1..1000] of byte;
      bufin,bufout:array[1..100000] of byte;
      ok:boolean;

begin
  assign(input,'critice.in');
  reset(input);
  settextbuf(input,bufin);
  assign(output,'critice.out');
  rewrite(output);
  settextbuf(output,bufout);

  readln(n,m);
  for i:=1 to m do
    begin
      readln(x[i],y[i],z);
      new(r);
      r^.info:=y[i];
      r^.next:=a[x[i]];
      a[x[i]]:=r;
      c[x[i],y[i]]:=z;
      new(r);
      r^.info:=x[i];
      r^.next:=a[y[i]];
      a[y[i]]:=r;
      c[y[i],x[i]]:=z;
    end;

  ok:=true;
  while ok do
    begin
      ok:=false;
      for i:=1 to n do
        begin
          from[i]:=0;
          vis[i]:=0;
        end;
      vis[1]:=1;
      new(coada);
      coada^.info:=1;
      v:=coada;
      while coada<>nil do
        begin
          q:=a[coada^.info];
          while q<> nil do
            begin
              if c[coada^.info,q^.info]<>0 then
              if vis[q^.info]=0 then
                begin
                  from[q^.info]:=coada^.info;
                  if q^.info=n then
                    begin
                      ok:=true;
                      min:=1000000000;
                      z:=n;
                      while from[z]<>0 do
                        begin
                          if min>c[from[z],z] then min:=c[from[z],z];
                          z:=from[z];
                        end;
                      z:=n;  f:=f+min;
                      while from[z]<>0 do
                        begin
                          c[from[z],z]:=c[from[z],z]-min;
                          c[z,from[z]]:=c[z,from[z]]+min;
                          z:=from[z];
                        end;
                    end else
                    begin
                      vis[q^.info]:=1;

                      new(r);
                      r^.info:=q^.info;
                      v^.next:=r;
                      v:=r;
                    end;
                end;
              q:=q^.next;
            end;
          coada:=coada^.next;
        end;
    end;

  for i:=1 to n do
        begin
          vis[i]:=0;
        end;
      vis[1]:=1;
      new(coada);
      coada^.info:=1;
      v:=coada;
      while coada<>nil do
        begin
          q:=a[coada^.info];
          while q<> nil do
            begin
              if c[coada^.info,q^.info]=0 then
                begin
                  cr[coada^.info,q^.info]:=1;
                end else
              if vis[q^.info]=0 then
                begin

                  if q^.info<>n then

                    begin
                      vis[q^.info]:=1;

                      new(r);
                      r^.info:=q^.info;
                      v^.next:=r;
                      v:=r;
                    end;
                end;
              q:=q^.next;
            end;
          coada:=coada^.next;
        end;

  ok:=true;
  while ok do
    begin
      ok:=false;
      for i:=1 to n do
        begin
          from[i]:=0;
          vis[i]:=0;
        end;
      vis[n]:=1;
      new(coada);
      coada^.info:=n;
      v:=coada;
      while coada<>nil do
        begin
          q:=a[coada^.info];
          while q<> nil do
            begin
              if c[coada^.info,q^.info]<>0 then
              if vis[q^.info]=0 then
                begin
                  from[q^.info]:=coada^.info;
                  if q^.info=1 then
                    begin
                      ok:=true;
                      min:=1000000000;
                      z:=1;
                      while from[z]<>0 do
                        begin
                          if min>c[from[z],z] then min:=c[from[z],z];
                          z:=from[z];
                        end;
                      z:=1;
                      while from[z]<>0 do
                        begin
                          c[from[z],z]:=c[from[z],z]-min;
                          c[z,from[z]]:=c[z,from[z]]+min;
                          z:=from[z];
                        end;
                    end else
                    begin
                      vis[q^.info]:=1;

                      new(r);
                      r^.info:=q^.info;
                      v^.next:=r;
                      v:=r;
                    end;
                end;
              q:=q^.next;
            end;
          coada:=coada^.next;
        end;
    end;

  for i:=1 to n do
        begin
          vis[i]:=0;
        end;
      vis[n]:=1;
      new(coada);
      coada^.info:=n;
      v:=coada;
      while coada<>nil do
        begin
          q:=a[coada^.info];
          while q<> nil do
            begin
              if c[coada^.info,q^.info]=0 then
                begin
                  cr2[coada^.info,q^.info]:=1;
                end else
              if vis[q^.info]=0 then
                begin

                  if q^.info<>1 then

                    begin
                      vis[q^.info]:=1;

                      new(r);
                      r^.info:=q^.info;
                      v^.next:=r;
                      v:=r;
                    end;
                end;
              q:=q^.next;
            end;
          coada:=coada^.next;
        end;

  for i:=1 to m do
    if ((cr[x[i],y[i]]=1)or(cr[y[i],x[i]]=1))and
       ((cr2[x[i],y[i]]=1)or(cr2[y[i],x[i]]=1))then inc(ans);
  writeln(ans);
  for i:=1 to m do
    if ((cr[x[i],y[i]]=1)or(cr[y[i],x[i]]=1))and
       ((cr2[x[i],y[i]]=1)or(cr2[y[i],x[i]]=1)) then writeln(i);
  close(output);
end.