pat-1076

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其他情况要再总结一下

猜你喜欢

转载自blog.csdn.net/m0_45359314/article/details/112908655