1. 程式人生 > >圖的遍歷 | 1076 bfs

圖的遍歷 | 1076 bfs

stdio.h map 判斷 clu front queue memset pre strong

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; }

圖的遍歷 | 1076 bfs