码迷,mamicode.com
首页 > 其他好文 > 详细

nzhtl1477-ただいま帰りました ( bfs )

时间:2018-11-01 16:09:14      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:==   在线   ext   距离   str   特殊   bsp   \n   ++   

nzhtl1477-ただいま帰りました

题目描述

珂学题意:

你是威廉!你要做黄油蛋糕给珂朵莉吃~

68号岛有n个商店,有的商店直接有小路连接,小路的长度都为1

格里克告诉了你哪些地方可能有做黄油蛋糕的原料

但是那个人是个坑货,所以

他会告诉你一些商店,然后告诉你距离这些商店距离<= k的商店中都是可能有原料的

然后你要把这些可能的商店每个都去一遍

你想知道你要去多少个商店

由于你是勇者,所以有m次询问

简洁题意:

给你一个图,每次查询的时候给一堆特殊点以及一个数k,求图中有多少点距离至少一个特殊点距离不超过k

边是无向的

输入输出格式

输入格式:

第一行三个数表示nmq

之后m行每行两个数xy表示这两个点之间连有一条边~

之后q次询问,每个询问先给你一个数a和一个数k

之后一行a个数,表示a个特殊点

输出格式:

q行,每行一个数表示答案

输入输出样例

输入样例#1 复制

5 6 6

2 3

1 3

2 5

1 3

3 2

2 5

1 1

3

1 1

1

1 4

1

1 2

5

1 4

1

1 4

5

输出样例#1 复制

3

2

4

3

4

4

说明

对于30%的数据,nmq <= 100,每次查询只给一个点

对于另外30%的数据,k=1

对于100%的数据,nmq <= 5000 , a的和<= 500000

 

 

解析

在线操作;将每一个点加入队列中间,类似修改了的spfa算法;

同时将几个点加入,就可以将剩下的点按照离他们最近的中心点的距离计算出来;

 

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define rint register int

inline int read(){
    int x=0,f=0;char ch=getchar();
    while(!isdigit(ch)) f=(ch==45),ch=getchar();
    while( isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return f?(~x+1):x;
}

#define man 5050

struct edge{    int next,to;}e[man<<1];
int head[man<<1],num=0;

inline void add(int from,int to){
    e[++num]=(edge){head[from],to};
    head[from]=num;
}

int n,m,q;
int dis[man],vis[man],tot,k;


int main(){
    memset(dis,63,sizeof(dis));
    n=read();m=read();q=read();
    for(rint i=1,x,y;i<=m;i++){
        x=read();y=read();
        add(x,y);add(y,x);
    }
    for(rint i=1,cnt;i<=q;i++){
        queue<int>q;tot=0;
        memset(vis,0,sizeof(vis));
        memset(dis,63,sizeof(dis));
        cnt=read();k=read();
        for(rint x,i=1;i<=cnt;i++){
            x=read();
            q.push(x);dis[x]=0;vis[x]=1;
        }
        do{
            int u=q.front();q.pop();
            for(rint i=head[u];i;i=e[i].next){
                int to=e[i].to;
                dis[to]=min(dis[to],dis[u]+1);
                if(!vis[to]) vis[to]=1,q.push(to);
            }
        }while(q.size());
        for(rint i=1;i<=n;i++)
            if(dis[i]<=k) tot++;        
        printf("%d\n",tot);
    }
    return 0;
}

 

nzhtl1477-ただいま帰りました ( bfs )

标签:==   在线   ext   距离   str   特殊   bsp   \n   ++   

原文地址:https://www.cnblogs.com/Slager-Z/p/9889457.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!