微博被稱爲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;
}