比赛 20120710 评测结果 AAAAA
题目名称 RCDH外星人 最终得分 100
用户昵称 IMSL77 运行时间 0.041 s
代码语言 Pascal 内存使用 7.11 MiB
提交时间 2012-07-10 11:57:19
显示代码纯文本
program et;
type
  integer=longint;
const
  maxn=40000;
  maxm=400000;
  maximp=10;
var
  n,m:integer;
  tot,ans:integer;
  ver:array[1..maxn] of integer;
  en,next:array[1..maxm] of integer;
  l:array[1..maxm] of integer;
  imp:array[1..maxn] of integer;
  d:array[1..maxn] of integer;
  mark,tick:array[1..maxn] of boolean;
  list,ed:array[1..maxn] of integer;
  Q:array[1..maxn*10] of integer;

  procedure Fopen;
  begin
    assign(input,'et.in'); reset(input);
    assign(output,'et.out'); rewrite(output);
  end;

  procedure Fclose;
  begin
    close(input); close(output);
  end;

  procedure addedge(u,v,c:integer);
  begin
    inc(tot);
    en[tot]:=v; next[tot]:=ver[u]; ver[u]:=tot;
    l[tot]:=c;
  end;

  procedure SetGraph;
  var
    i:integer;
    u,v,c:integer;
  begin
    readln(n,m);
    for i:=1 to n do readln(imp[i]);
    fillchar(ver,sizeof(ver),0);
    fillchar(next,sizeof(next),0);
    tot:=0;
    for i:=1 to m do
    begin
      readln(u,v,c);
      addedge(u,v,c); addedge(v,u,c);
    end;
  end;

  procedure Spfa(s:integer);
  var
    head,tail:integer;
    k,x,y:integer;
  begin
    tot:=1; list[1]:=s; tick[s]:=false; ed[1]:=d[s];
    d[s]:=0; mark[s]:=false;
    head:=1; tail:=2;
    Q[1]:=s;
    repeat
      x:=Q[head];
      k:=ver[x];
      while k>0 do
      begin
        y:=en[k];
        if d[x]+l[k]<d[y] then
        begin
          if tick[y] then
          begin
            inc(tot); list[tot]:=y;
            tick[y]:=false; ed[tot]:=d[y];
          end;
          d[y]:=d[x]+l[k];
          if mark[y] then
          begin
            mark[y]:=false;
            Q[tail]:=y; inc(tail);
          end;
        end;
        k:=next[k];
      end;
      mark[x]:=true;
      inc(head);
    until head=tail;
    for k:=1 to tot do begin d[list[k]]:=ed[k]; tick[list[k]]:=true; end;
    inc(ans,tot);
  end;

  procedure Spfa2(p:integer);
  var
    head,tail:integer;
    k,x,y:integer;
  begin
    head:=1; tail:=1;
    for k:=1 to n do if imp[k]=p then
    begin
      d[k]:=0; mark[k]:=false;
      Q[tail]:=k; inc(tail);
    end;
    while head<tail do
    begin
      x:=Q[head];
      k:=ver[x];
      while k>0 do
      begin
        y:=en[k];
        if d[x]+l[k]<d[y] then
        begin
          d[y]:=d[x]+l[k];
          if mark[y] then
          begin
            mark[y]:=false;
            Q[tail]:=y; inc(tail);
          end;
        end;
        k:=next[k];
      end;
      mark[x]:=true;
      inc(head);
    end;
  end;
  procedure Solve;
  var
    i,j:integer;
  begin
    for i:=1 to n do d[i]:=maxlongint shr 1-1;
    fillchar(mark,sizeof(mark),true);
    fillchar(tick,sizeof(tick),true);
    ans:=0;
    for i:=maximp downto 1 do
    begin
      for j:=1 to n do if imp[j]=i then Spfa(j);
      Spfa2(i);
    end;
    writeln(ans);
  end;

begin
  Fopen;
  SetGraph;
  Solve;
  Fclose;
end.