PAT-图的遍历-1076 Forwards on Weibo

74 阅读1分钟

思路

  • 有bfs进行遍历,并用layer[]储存和查询点的层次即可。

注意

  • 别用dfs,因为有两个问题,第一个是求出一个长度的路径,有可能有更短的路径。第二个是最短路径被以及访问过的节点阻挡住了。

代码

#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
int n,l;
const int maxn=1010;
vector<int> adj[maxn];
bool vis[maxn]={false};
int ans;
int layer[maxn]; 
void initial(){
	for(int i=1;i<=n;i++) vis[i]=false;
}


void BFS(int u){
	queue<int> q;
	q.push(u);
	vis[u]=true;
	layer[u]=0;
	while(q.size()){
		int temp=q.front();
		q.pop();
		for(int i=0;i<adj[temp].size();i++){
			int v=adj[temp][i];
			if(vis[v]==false){
				vis[v]=true;
				q.push(v);
				layer[v]=layer[temp]+1;
				if(layer[v]<=l) ans++;
			}
		}
	}
}

int main(){
	scanf("%d%d",&n,&l);
	int a,b;
	for(int i=1;i<=n;i++){
		scanf("%d",&a);
		for(int j=0;j<a;j++){
			scanf("%d",&b);
			adj[b].push_back(i);
		}
	}
	int query;
	scanf("%d",&query);
	for(int i=0;i<query;i++){
		ans=0;
		initial(); 
		scanf("%d",&a);
		BFS(a);
		printf("%d\n",ans);
	}
	return 0;
}