【PAT甲级】1076 Forwards on Weibo (30 分)

题意:

输入两个正整数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<<"\n";
60     }
61     return 0;
62 }

 

 

 

posted @ 2019-11-07 20:53  sewage  阅读(115)  评论(0编辑  收藏  举报