外星人入侵_纪中3077_spfa

56 篇文章 0 订阅

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值