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
Output
共A行,第i行1个整数,表示当外星人建好第i个基地后,距离当前所有基地B1,B2,…,Bi至少K长度的城市的数量。
Analysis
随着外星人基地数量的增加,安全的点会减少或不变,所以记录到目前为止的安全点,每次从这些安全点中筛除不安全的统计答案
第一次交没过然后扩大数组就A了
数组啊数组啊
Code
#include <stdio.h>
#include <cstring>
#include <queue>
using namespace std;
struct edge
{
int x,y,w,next;
};
queue<int>q;
edge e[1000001];
bool v[10001],f[10001];
int ls[10001],dis[10001];
int maxE=0,n,m,a,k,x,y,w,ans;
void add(int x,int y,int w)
{
e[++maxE]=(edge){x,y,w,ls[x]};
ls[x]=maxE;
}
void spfa(int st)
{
q.push(st);
while (q.size())
{
int now=q.front();
q.pop();
for (int i=ls[now];i;i=e[i].next)
{
if (e[i].w+dis[now]<dis[e[i].y])
{
dis[e[i].y]=e[i].w+dis[now];
if (!v[e[i].y])
{
v[e[i].y]=true;
q.push(e[i].y);
}
}
}
v[now]=false;
}
ans=0;
for (int i=1;i<=n;i++)
if (dis[i]>=k&&!f[i])
ans++;
else
f[i]=true;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&a,&k);
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&w);
add(x,y,w);
add(y,x,w);
}
for (int i=1;i<=n;i++)
dis[i]=1<<28;
for (int i=1;i<=a;i++)
{
scanf("%d",&x);
dis[x]=0;
spfa(x);
printf("%d\n",ans);
}
return 0;
}