外星人入侵 (Standard IO)

来源:互联网 发布:女生当程序员 编辑:程序博客网 时间:2024/09/21 09:01

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.
1 0
原创粉丝点击