nzhtl1477-ただいま帰りましたc++
珂學題意:git
你是威廉!你要作黃油蛋糕給珂朵莉吃~!算法
68號島有n個商店,有的商店直接有小路鏈接,小路的長度都爲1spa
格里克告訴了你哪些地方可能有作黃油蛋糕的原料code
可是那我的是個坑貨,因此blog
他會告訴你一些商店,而後告訴你距離這些商店距離<= k的商店中都是可能有原料的隊列
而後你要把這些可能的商店每一個都去一遍get
你想知道你要去多少個商店it
因爲你是勇者,因此有m次詢問class
簡潔題意:
給你一個圖,每次查詢的時候給一堆特殊點以及一個數k,求圖中有多少點距離至少一個特殊點距離不超過k
邊是無向的
輸入格式:
第一行三個數表示n,m,q
以後m行每行兩個數x,y表示這兩個點之間連有一條邊~
以後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%的數據,n,m,q <= 100,每次查詢只給一個點
對於另外30%的數據,k=1
對於100%的數據,n,m,q <= 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; }