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

nzhtl1477-ただいま帰りましたc++

題目描述

珂學題意:git

你是威廉!你要作黃油蛋糕給珂朵莉吃~算法

68號島有n個商店,有的商店直接有小路鏈接,小路的長度都爲1spa

格里克告訴了你哪些地方可能有作黃油蛋糕的原料code

可是那我的是個坑貨,因此blog

他會告訴你一些商店,而後告訴你距離這些商店距離<= k的商店中都是可能有原料的隊列

而後你要把這些可能的商店每一個都去一遍get

你想知道你要去多少個商店it

因爲你是勇者,因此有m次詢問class

簡潔題意:

給你一個圖,每次查詢的時候給一堆特殊點以及一個數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;
}
相關文章
相關標籤/搜索