zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    阿里P8架构师谈:阿里双11秒杀系统如何设计?
    秒杀系统设计的知识点
    秒杀系统架构优化思路
    秒杀系统解决方案
    Entity Framework Code First (七)空间数据类型 Spatial Data Types
    Entity Framework Code First (六)存储过程
    Entity Framework Code First (五)Fluent API
    Entity Framework Code First (四)Fluent API
    Entity Framework Code First (三)Data Annotations
    Entity Framework Code First (二)Custom Conventions
  • 原文地址:https://www.cnblogs.com/Slager-Z/p/9889457.html
Copyright © 2011-2022 走看看