题意:
输入两个正整数N和L(N<=1000,L<=6),接着输入N行数据每行包括它关注人数(<=100)和关注的人的序号,接着输入一行包含一个正整数K和K个序号。输出每次询问的人发出消息经过至多L层转发最多有多少人转发。
trick:
逻辑搞错的程序也能得到25或28分。。。
AAAAAccepted code:
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int visit[1007][1007]; 5 vector<int>st[1007]; 6 int l; 7 int vis[1007]; 8 int ans; 9 int last; 10 int lv[1007]; 11 void dfs(int x){ 12 queue<int>q; 13 q.push(x); 14 vis[x]=1; 15 lv[x]=1; 16 while(!q.empty()){ 17 int now=q.front(); 18 q.pop(); 19 for(auto it:st[now]) 20 if(!vis[it]&&lv[now]<=l){ 21 ++ans; 22 q.push(it); 23 vis[it]=1; 24 lv[it]=lv[now]+1; 25 } 26 } 27 return; 28 } 29 int main(){ 30 ios::sync_with_stdio(false); 31 cin.tie(NULL); 32 cout.tie(NULL); 33 int n; 34 cin>>n>>l; 35 for(int i=1;i<=n;++i){ 36 int m; 37 cin>>m; 38 int x; 39 for(int j=1;j<=m;++j){ 40 cin>>x; 41 if(!visit[x][i]){ 42 visit[x][i]=1; 43 st[x].push_back(i); 44 } 45 } 46 } 47 int k; 48 cin>>k; 49 for(int i=1;i<=k;++i){ 50 if(i>1) 51 for(int j=1;j<=n;++j) 52 vis[j]=0,lv[1007]; 53 ans=0; 54 int x; 55 cin>>x; 56 dfs(x); 57 cout<<ans; 58 if(i!=k) 59 cout<<" "; 60 } 61 return 0; 62 }