C++ 算法 微博转发问题\图\BFS

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值