patA1076

思路:该问题求最多转发层数内最多的转发人数,实际上就是从所要求的点进行BFS,然后计算限制层数内的节点数。
代码如下:

#include <iostream>
#include <vector>
#include <queue>
#include <cstdio>
#include <string.h>

using namespace std;


/*一个节点*/
struct node {
	int id;		//节点编号
	int level;	//BFS的层数
	node(int x,int y):id(x),level(y){}
};

#define MAX 1010
//总人数
int N = 0;
//转发层数
int L = 0;
//被查询的人的数量
int K = 0;
//邻接矩阵,节点编号从1开始
vector<node> adj[MAX];
//节点是否进入过队列
bool inq[MAX] = { false };


/*读部分输入*/
void input() {
	cin >> N >> L;
	for (int i = 1; i <= N; i++) {
		//节点的前驱数n
		int n;
		cin >> n;
		for (int j = 0; j < n; j++) {
			//前驱节点的编号x
			int x;
			cin >> x;
			adj[x].push_back(node(i,0));
		}
	}
}



/*对指定编号的节点,求最大转发数*/
int cal(int id) {
	//计数器
	int cnt = -1;	

	//对id进行BFS
	queue<node> q;
	q.push(node(id,0));
	inq[id] = true;
	while (!q.empty()) {
		int cid = q.front().id;	//当前栈顶id
		node front = q.front();
		q.pop();
		
		//判断是否超过层数
		if ( front.level> L)
			break;

		cnt++;

		for (int i = 0; i < adj[cid].size(); i++) {
			int v = adj[cid][i].id;
			if (!inq[v]) {							
				inq[v] = true;
				q.push(node(v, front.level + 1));
			}
		}
	}

	return cnt;
}


int main(void) {
	input();
	
	cin >> K;
	for (int i = 0; i < K; i++) {
		int j;		//当前要计算的节点的编号
		cin >> j;
		cout<<cal(j)<<endl;

		//重置inq数组
		memset(&inq, false, MAX);
	}
	
}




这里要注意每对一个待求的点进行BFS前,都要重置inq数组。
另外,邻接表中的元素其实不应该是node类型,使用int型即可,这是代码的一个问题。

posted @ 2022-04-23 19:37  带带绝缘体  阅读(18)  评论(0编辑  收藏  举报