bfs 入一个访问一个,不是出一个访问一个
#include<iostream>
#include<vector>
#include<queue>
#include<vector>
using namespace std;
vector<int> v[1009];
struct node{
int id,l;
};
queue<node>q;
int visit[1009],ll,cnt=0;//visit,cnt需重置
void bfs(int idd){
//end
q.push({idd,0});
visit[idd]=1;
while(!q.empty()){
node temp=q.front();
q.pop();
//不是出一个访问一个而是入一个访问一个,不然本来那个已经计数访问完毕,不能再访问,但由于没有标记,下一个还会访问他导致重复访问,bfs是入一个访问一个,一开始要在外面就做好标记(注意)
/*for(int i=0;i<v[temp.id].size();i++){//i<v[idd].size()错误此处始终为一开始的size错误应为取出队列的的size(注意)
if(visit[v[temp.id][i] ]==0&&temp.l<ll){
q.push({v[temp.id][i],temp.l+1} );//fu-zi-bc
cnt++;
}
}*/
for(int i = 0; i < v[temp.id].size(); i++) {
int nextid = v[temp.id][i];
if(visit[nextid] == 0 && temp.l < ll) {
node next = {nextid, temp.l + 1};
q.push(next);
//inq[next.id] = true;
visit[next.id]=1;
cnt++;
}
}
}
}
/*
void bfs(node tnode) {
bool inq[1010] = {false};
queue<node> q;
q.push(tnode);
inq[tnode.id] = true;
cnt = 0;
while(!q.empty()) {
node top = q.front();
q.pop();
int topid = top.id;
for(int i = 0; i < v[topid].size(); i++) {
int nextid = v[topid][i];
if(inq[nextid] == false && top.l < ll) {
node next = {nextid, top.l + 1};
q.push(next);
inq[next.id] = true;
cnt++;
}
}
}
//return cnt;
}*/
int main(){
int n,k,tempp,kk;
cin>>n>>ll;
for(int i=1;i<=n;i++){
cin>>k;
for(int j=1;j<=k;j++){
cin>>tempp;
v[tempp].push_back(i);
}
}
cin>>kk;
for(int i=0;i<kk;i++){
//int visit[1009]={0};
fill(visit,visit+1009,0);
cnt=0;
cin>>tempp;
//node qw={tempp,0};
bfs(tempp);
printf("%d\n",cnt);
}
return 0;
}
总结1. //不是出一个访问一个而是入一个访问一个,不然本来那个已经计数访问完毕,不能再访问,但由于没有标记,下一个还会访问他导致重复访问,bfs是入一个访问一个,一开始要在外面就做好标记,因为后面已经计数了(注意)
2.更正昨天 int v[1009]={0},也没用以后只能用fill
3.题意中给的是子父标存的时候要颠倒一下
英语
问题BFS其他情况要再总结一下