bfs踩了很多坑才写完。注意:出队时不做是否vis判断,但是要加上vis[出队顶点]=1 。入队时进行判断,并且也要 vis[入队顶点]=1
#include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm> #include <map> #define I scanf #define OL puts #define O printf #define F(a,b,c) for(a=b;a<c;a++) #define FF(a,b) for(a=0;a<b;a++) #define FG(a,b) for(a=b-1;a>=0;a--) #define LEN 1010 #define MAX 0x06FFFFFF #define V vector<int> using namespace std; vector<int> g[LEN]; int vis[LEN]; int main(){ // freopen("D:\\CbWorkspace\\PAT\\图的遍历\\1076.txt","r",stdin); int n,l,i,j,m,a,b,t,k; I("%d%d",&n,&l) ; F(i,1,n+1){ I("%d",&m); FF(j,m){ I("%d",&t); g[t].push_back(i); } } I("%d",&k); FF(i,k){ I("%d",&t); memset(vis,0,sizeof vis); queue<int> q; q.push(t); int level=0; int cnt=0; while(!q.empty()){ int sz=q.size(); while(sz-->0){ //每一层bfs int tmp=q.front(); q.pop(); // if(vis[tmp]) continue; //出队防止遍历已知点 vis[tmp]=1; FF(j,g[tmp].size()){ //遍历后继 int o=g[tmp][j]; if(vis[o]==0){ //入队防止遍历已知点 vis[o]=1; q.push(o); cnt++; } } } level++; if(level>=l) break; } printf("%d\n",cnt) ; } return 0; }
原文地址:https://www.cnblogs.com/TQCAI/p/8513881.html
时间: 2024-11-02 10:30:26