⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 marica.pas

📁 PASCAL光盘资料PASCAL光盘资料PASCAL光盘资料
💻 PAS
字号:

{
  Izborne pripreme 2001 - Drugi izborni ispit
  Zadatak MARICA
  Autor rjesenja Matija Kazalicki
  Nesluzbeno rjesenje
}

{
  rjesenje slozenosti dijkstra * broj vrhova u najkracem putu
  dijkstra pretpostavlja da se uvijek moze spojiti
}

const maxvrh = 1000;
      INFILE = 'marica.in';
      OUTFILE = 'marica.out';
      MAXLONG = 1000000;
type edge = record
     x, y: longint;
    end;

var  koliko : array[ 0..maxvrh ] of longint;
     vrh: array[ 0..maxvrh, 0..maxvrh ] of longint;
     tezina: array[ 0..maxvrh, 0..maxvrh ] of longint;
     pocetak, kraj : longint;
     v, e :longint;


     pamtilo:array[0..maxvrh] of edge;
     stanje :array[0..maxvrh] of longint;
     ukupno, jos :longint ;


     udaljenost:array[0..maxvrh] of longint;
     bio:array[0..maxvrh] of longint;

     rezultat: longint;

     b: edge;

     i,j :longint;

     jpg:boolean;

     mark: array[ 0..maxvrh, 0..maxvrh ] of longint;


procedure unos;
var f:text;
    i:longint;
    a,b,c:longint;
 begin
     fillchar(koliko,sizeof(koliko), 0 );
     fillchar(tezina,sizeof(tezina), 0 );
     rezultat:= 0;

     assign( f, INFILE ); reset( f );
     readln(f, v, e);
     for i:=1 to e do
       begin
        readln(f, a, b, c);
        inc( koliko[ a ]); vrh[ a, koliko[ a ] ] := b;
        inc( koliko[ b ]); vrh[ b, koliko[ b ] ] := a;
        tezina[ a, b ]:=c;
        tezina[ b, a ]:=c;

       end;

     pocetak:=1;
     kraj:=v;

     close( f );

 end;

procedure dijkstra( brid: edge );
var i, j, min, odabran :longint;
  begin
    jpg:=true;
    for i:=1 to v do
      begin
        udaljenost[i]:= maxlong;
        bio[i]:=0;
      end;

  udaljenost[pocetak]:=0;bio[pocetak]:=1;


  while (bio[kraj] >= 0) and (jpg) do
    begin

      min:=maxlong;

      for i:= 1 to v do if ( udaljenost[i] < min ) and ( bio[i] > 0 ) then
         begin
           min:= udaljenost[i];
           odabran:= i;
         end;

   {dodano}  if min =maxlong then
     begin
        jpg:=false;
        break;
      end;

     bio[odabran]:= -bio[odabran];

     for i:=1 to koliko[odabran] do
       begin

         if (( vrh[odabran,i] <> brid.y ) or ( odabran <> brid.x )) and (( vrh[odabran,i] <> brid.x ) or ( odabran <> brid.y )) then
           if udaljenost[vrh[odabran,i]]  > ( udaljenost[odabran] + tezina[odabran,vrh[odabran,i]]) then
              begin

                bio[vrh[odabran,i]]:=odabran;
                udaljenost[vrh[odabran,i]] :=  udaljenost[odabran] + tezina[odabran,vrh[odabran,i]] ;

              end;



       end;

    end;
  bio[pocetak]:=0;
  if udaljenost[kraj] > rezultat  then rezultat:= udaljenost[kraj] ;

  end;


procedure gen;
var i:longint;
 begin

   fillchar( stanje , sizeof( stanje ), 0 );
   fillchar( mark, sizeof( mark ), 0 );

   i:=kraj;
   while bio[i] <> 0 do
     begin

       b.x := -bio[i];
       b.y := i;
       inc( ukupno );
       pamtilo[ukupno]:=b;
       i:= - bio[i];
       mark[ b.x, b.y ] := ukupno;
     end;
     jos:=ukupno;



 end;

procedure oznaci;
var j:longint;

    temptab:array[ 0.. maxvrh] of longint;
begin

  fillchar( temptab, sizeof( temptab ), 0 );

  j:= kraj;

  while bio[j] <>0 do
    begin

     temptab[mark[-bio[j],j]]:=1;
     j:= - bio[j];

    end;

  for j:=1 to ukupno do

    if ( temptab[j]=0 ) and ( stanje[j]=0 ) then
       begin
         stanje[j]:=1;
         dec( jos );
       end;


end;

procedure ispis;
var f:text;
 begin
  assign( f, OUTFILE ); rewrite ( f );
  if jpg then writeln( f, rezultat ) else writeln(f,'NEMA RJESENJA' );
  close( f );

 end;

begin
 unos;
 jpg:=true;
 b.x:=0; b.y:=0;
 dijkstra( b );
 gen;
 i:=1;

 while (jos <>0) and jpg do
   begin

     while stanje[i]<>0 do inc( i );

     stanje[i]:= 1; dec( jos );
     b.x:=pamtilo[i].x; b.y:=pamtilo[i].y;
     dijkstra( b );
     if not jpg then break;
     oznaci;


   end;

 ispis;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -