外星人入侵 (Standard IO)

Description

外星人入侵地球。可怕的吃人外星人正在全国各地依次序建立它们的基地。

全国共有N(1≤ N ≤10,000)座城市,城市编号1~N。城市之间有M(0≤ M ≤100,000)条双向道路相连。外星人计划建立A(0≤A≤N)个基地。

你只有在距离当前所有外星人基地至少K(1≤K≤100)单位长度的城市才能得到安全。

所以你必须赶快写一个程序决定走到哪里去。

Input

第1行:4个整数N, M, A, K

接下来M行,每行3个整数T1, T2(1≤T1

const
  maxE=100001;
  maxV=400001;

type
  arr=record
    x,y,w,next:int64;
  end;

var
  n,m,nm,nn,mm,ans:longint;
  a:array [0..maxV] of arr;
  ls:array [0..maxE] of longint;
  list,d,v:array [0..maxE] of int64;
  f:array [0..10001] of boolean;
procedure spfa(st:longint);
var
  i,k,h,t:longint;
begin
  fillchar(d,sizeof(d),63);
  fillchar(v,sizeof(v),0);
  fillchar(list,sizeof(list),0);
  h:=0; t:=1;
  v[st]:=1; list[1]:=st; d[st]:=0;
  repeat
    h:=h+1;
    i:=ls[list[h]];
    while i<>0 do
      begin
        with a[i] do
          begin
            if d[x]+w<d[y] then
              begin
                d[y]:=d[x]+w;
                if v[y]=0 then
                  begin
                    t:=t+1;
                    list[t]:=y;
                    v[y]:=1;
                  end;
              end;
            i:=next;
          end;
      end;
    v[list[h]]:=0;
  until h=t;
end;

procedure init;
var
  i:longint;
begin
  readln(n,m,nn,mm);
  for i:=1 to m do
    begin
      with a[i] do
        begin
          readln(x,y,w);
          next:=ls[x];
          ls[x]:=i;
        end;
      with a[m+i] do
        begin
          x:=a[i].y; y:=a[i].x;
          w:=a[i].w;
          next:=ls[x];
          ls[x]:=i+m;
        end;
    end;
  m:=m*2;
end;

procedure print;
var
  i,j,t:longint;
begin
  fillchar(f,sizeof(f),true);
  for i:=1 to nn do
    begin
      readln(t);
      spfa(t);
      ans:=0;
      for j:=1 to n do
        if (d[j]>=mm) and f[j] then inc(ans)
                               else f[j]:=false;
      writeln(ans);
    end;
end;

begin
  init;
  print;
end.

posted @ 2016-08-17 12:04  猪都哭了  阅读(203)  评论(0)    收藏  举报