PAT A1076
BFS的题,题不难,有几个注意点
- 首先,读懂题意,下面每行的是被转发的,比如在数据1的行里面出现了4,是4发布的内容被1转发了
- ans里面不包括源头,但是while里面带循环第一次出队列有,所以要从ans=-1开始,另外是出栈的时候计数
- 第一个点的ceng是0
- 在判断的时候,只能加没入过队的(入队改vis),然后在判断层的时候,能继续扩张的都是ceng<=len-1的,然后他们扩张ceng=len的,之后这些不需要在扩张
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<string.h> #include<queue> using namespace std; int n,l,k; int G[1005][1005];//一是被转发的,是源头 bool vis[1005]={false}; struct node{ int num; int ceng; node(int a,int b) { num=a; ceng=b; } }; int BFS(int num) { memset(vis,0,sizeof(vis)); int ans=-1;//发信息的本体不算在ans里面,在top里面计算了要去掉 vis[num]=true; queue<node>q; node tempnode=node(num,0); q.push(tempnode); while(!q.empty()) { ans++; node top=q.front(); q.pop(); for(int i=1;i<=n;i++) { if(vis[i]==false && G[top.num][i]>0 && top.ceng<l)//最后可以进来的是ceng=l.前面最多l-1,才能保证l { q.push(node(i,top.ceng+1)); vis[i]=true; } } } return ans; } int main() { cin>>n>>l; memset(G,0,sizeof(G)); for(int i=1;i<=n;i++) { int temp,num; cin>>temp; for(int j=1;j<=temp;j++) { cin>>num; G[num][i]=1; } } cin>>k; for(int i=1;i<=k;i++) { int tempnum; cin>>tempnum; cout<<BFS(tempnum)<<endl; } return 0; }