外星人入侵_纪中3077_spfa

来源:互联网 发布:邓布利多 知乎 编辑:程序博客网 时间:2024/05/02 06:52

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