外星人入侵 (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.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值