7-1 微博转发 (25分)
在微博中,每个用户都可能被若干其他用户关注。而当该用户发布一条信息时,他的关注者就可以看到这条信息并选择是否转发它,且转发的信息也可以被转发者的关注者再次转发,但同一用户最多转发该信息一次(信息的最初发布者不能转发该信息)。现在给出N个用户的关注者情况(即他们各自关注了哪些用户)以及一个转发层数上限L,并给出最初发布消息的用户编号,求在转发层数上限内消息最多会被多少用户转发。
输入格式:
第一行包含两个正数:N(N≤100)是用户数量;L(L≤6)表示关注者的转发层数上限。假设所有用户编号从1到N。
接下来的N行,每行格式如下:
M[i] userlist[i]
M[i]表示用户user[i]的关注者数量;userlist[i]是用户user[i]的M[i]个关注者列表。没有用户关注自己。每个数字用空格隔开。
最后一行给出一个正数K,表示有K个用户发布信息,后面的K个数字是发布信息用户的编号。
输出格式:
每行是一个发布信息用户在转发层数上限内最多会被用户转发的数量。假设每个用户只会转发一次。
输入样例:
在这里给出一组输入。例如:
7 3
3 2 3 4
0
2 5 6
2 3 1
2 3 4
1 4
1 5
2 3 6
输出样例:
在这里给出相应的输出。例如:
4
5
用户关系如图所示 :
解题方法:
BFS用一个结构体Trans保存转发用户和次数.
代码:
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
class Graph{
public :
int N,E;
int type;
vector<vector<int> > g;
Graph(int N=0,int E=0,int type=0){
this->N=N;
this->E=E;
this->type=type;
this->g=vector<vector<int> >(N+1,vector<int>(N+1,0));
}
print(){
for(int i=0;i<=N;i++){
for(int j=0;j<=N;j++){
cout<<g[i][j]<<" ";
}
cout<<endl;
}
}
add(int v,int d,int w){
g[v][d]=w;
if(type==1){
g[d][v]=w;
}
}
};
Graph g=Graph(0,0,0);
struct Trans{
int user;
int times;
};
int bfs(int v,int l){
int vis[g.N]={0};
int count=0;
queue<Trans> q=queue<Trans>();
Trans t={v,0};
q.push(t);
while(!q.empty()){
int user=q.front().user;
int times =q.front().times;
q.pop();//出队
if(vis[user]==0 && times<=l){
vis[user]=1;//标记访问
cout<<user<<" ";//输出转发者编号
count++;//转发次数+1
//寻找关注此人且没访问过的人
for(int i=0;i<g.N;i++){
if(g.g[user][i]==1 && vis[i]==0){
Trans p={i,times+1};
q.push(p);
}
}
}
}
return --count;
}
int main(void){
int N,L;
cin>>N>>L;
g=Graph(N,N,0);
for(int i=1;i<=N;i++){
int n;//关注数量
cin>>n;
//读取关注列表
for(int j=0;j<n;j++){
int d;
cin>>d;
g.add(i,d,1);
}
}
g.print();
int userCount;
cin>>userCount;
for(int i=0;i<userCount;i++){
int user;
cin>>user;
cout<<bfs(user,L)<<endl;
}
return 0;
}