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


    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
    ",tot);
        }
        return 0;
    }
  • 相关阅读:
    驱动表
    将索引移动到别的表空间
    log file sync, log file parallell write
    Full Hint
    4wpa_supplicant适配层 详解
    wifi 驱动 进阶11
    wifi 驱动 进阶11
    基于linux2.6.38.8内核的SDIO/wifi驱动分析
    6wpa_supplicant无线网络配置
    2系统启动后的 wifi加载 过程图解
  • 原文地址:https://www.cnblogs.com/Slager-Z/p/9889457.html
Copyright © 2020-2023  润新知