【一隻蒟蒻的刷題歷程】 【PAT】 1076 微博轉發

微博被稱爲Twitter的中文版。微博上的一個用戶可能有很多關注者,也可能關注許多其他用戶。因此,形成了具有追隨者關係的社交網絡。當用戶在微博上發佈帖子時,他/她的所有關注者都可以查看並轉發他/她的帖子,然後他們的關注者可以再次轉發。現在給定一個社交網絡,假設只計算了L級間接關注者,則應該計算任何特定用戶的最大潛在轉發量。

輸入規格:

每個輸入文件包含一個測試用例。對於每種情況,第一行包含2個正整數:N(≤1000),用戶數;和L(≤6),即被計數的間接關注者的級別數。因此,假設所有用戶的編號都從1到N。然後是N行,每行的格式爲:

M [i]個用戶列表[i]

其中M [i](≤100)是用戶[i]跟隨的總人數; user_list [i]是緊隨user [i]的M [i]個用戶的列表。保證沒有人可以跟隨自己。所有數字都用空格分隔。

然後,最後給出一個正數K,後跟K個用戶ID進行查詢。

輸出規格:

對於每個UserID,假定每個可以查看初始帖子的用戶都將轉發一次,並且只計算L個級別的間接關注者,則應該在一行中打印出該用戶可以觸發的最大潛在轉發量。

輸入樣例:

7 3
3 2 3 4
0
2 5 6
2 3 1
2 3 4
1 4
1 5
2 2 6

樣本輸出:

4
5


思路:

一開始以爲每一行是別人關注了自己,沒想到是自己關注了別人,剛開始把圖的邊給存反了。因爲是被關注者指向關注者。


代碼:

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;  
struct node{
	int u;
	int deep;
	node(int a,int b){u=a;deep=b;}
};

const int maxn=1050;
int n,l;  //l爲最大深度
int k,x;
vector<node> g[maxn];   //存圖
bool inq[maxn]={false}; //是否入隊

int bfs(int lay,int s) //最大深度lay
{
	queue<node> q; //隊列,如果隊列放外面,要記得每次bfs時把隊列清空
	int num=0;  //總的轉發數
	q.push(node(s,0)); //起點入隊
	inq[s]=1;  //標記入過隊
	while(!q.empty())
	{
		int u=q.front().u; //取出隊首的u
		int deep=q.front().deep; //當前深度
		q.pop();  //記得pop
		for(int i=0;i<g[u].size();i++) 
		{
			int v=g[u][i].u; //第一個關注者
			if(inq[v]==false && deep+1<=lay) //下一深度要小於lay
			{
				num++; //總轉發數增加
				q.push(node(v,deep+1)); //入隊,深度+1
				inq[v]=1; //入過隊
			}
		}
	}
	return num;//返回數量
}

int main()
{
  cin>>n>>l;
  for(int i=1;i<=n;i++)
  {
  	cin>>k;
  	for(int j=0;j<k;j++)
  	{
  		cin>>x;
  		g[x].push_back(node(i,0)); //被關注着->關注着
	}
  }

  cin>>k;
  for(int i=0;i<k;i++)
  {
  	cin>>x;
  	fill(inq,inq+maxn,0); //把入隊情況初始化
    int ans=bfs(l,x); 
    cout<<ans<<endl;
  }
  return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章