算是我做的第一道30分题目吧。
题意
在微博中,每个用户都可能被若干个其他用户关注。而当该用户发布一条信息时,他的关注者就可以看到这条信息并选择是否转发它,且转发的信息也可以被转发者的关注者再次转发,但同一用户最多只转发该信息一次(信息的最初发布者不会转发该信息)。现在给出N个用户的关注情况(即他们各自关注了哪些用户)以及一个转发层数上限L,并给出最初发布消息的用户编号,求在转发层数上限内消息最多会被多少用户转发。
Sample Input:
7 3
3 2 3 4
0
2 5 6
2 3 1
2 3 4
1 4
1 5
2 2 6
Sample Output:
4
5
图例
思路
统计L层转发的人数,就是在BFS中统计层数在L下的节点数量
1.建图,用邻接表,如上图
2.用dfs处理时,注意每次遇到新的开始节点,要复原inq[]
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
struct Node{
int val;
int layer;
Node(int v, int lay):val(v), layer(lay){}
};
int N, L;
const int maxv = 1000;
vector<Node> Adj[maxv];
bool inq[maxv] = {false};
int cnt;
void BFS(int u){
int flag = 0;
queue<Node> q;
Node start(u, 0);
//start.val = u;
//start.layer = 0;
q.push(start);
inq[start.val] = true;
while(!q.empty()){
Node topNode = q.front();q.pop();//头节点出队
int s = topNode.val;
for(int i=0; i<Adj[s].size(); i++){
Node next = Adj[s][i];
next.layer = topNode.layer + 1;
if(next.layer > L){
flag = 1;
break;
}
if(inq[next.val] == false){
q.push(next);
inq[next.val] = true;
cnt++;
}
}
if(flag == 1)
break;
}
cout << cnt << endl;
for(int i=1; i<=N; i++){
for(int j=0; j<Adj[i].size(); j++)
Adj[i][j].layer = 0;
}
for(int i=0; i<maxv; i++)
inq[i] = false;
}
int main(){
cin >> N >> L;
//构造邻接表
for(int i=1; i<=N; i++){
int mi, temp;
cin >> mi;
for(int j=0; j<mi; j++){
cin >> temp;
Adj[temp].push_back(Node(i,0));
}
}
//输入K个开始节点start
int k, start;
cin >> k;
for(int i=0; i<k; i++){
cin >> start;
cnt = 0;
BFS(start);
}
/*check Adj[i][j]
for(int i=0; i<N; i++){
for(int j=0; j<Adj[i].size(); j++)
cout << Adj[i][j].val<< " ";
cout << endl;
}*/
}