PATクラスA 1076転送(30ポイント)| C ++実装

1.タイトルの説明

原题链接
Weiboはツイッターの中国語版として知られています。Weiboの1人のユーザーは多くのフォロワーを持っている可能性があり、他の多くのユーザーもフォローしている可能性があります。したがって、ソーシャルネットワークはフォロワーの関係で形成されます。ユーザーがWeiboで投稿を作成すると、すべてのフォロワーは自分の投稿を表示して転送でき、フォロワーは再び転送できます。ソーシャルネットワークが与えられたら、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

2、問題解決のアイデア

開始点を指定すると、グラフのレイヤーシーケンスが問題を横断します。ここで指定するデータは、他のユーザーをフォローしているユーザーであり、このユーザーをフォローしているユーザーではないため、隣接リストを作成するときに注意してください。入力クエリごとに、レイヤーシーケンストラバーサル(キューによって実装)を実行し、各ユーザーに対応するレイヤーの数をレベル配列に格納します。質問で必要なLを超えたら、ブレークします。

3、ACコード

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 1010;
vector<vector<int> > Adj;
int main()
{
    
    
  int N, L, num, tmp, query;
  scanf("%d%d", &N, &L);
  Adj.resize(N+1);
  for(int i=1; i<=N; i++)
  {
    
    
    scanf("%d", &num);
    for(int j=0; j<num; j++)
    {
    
    
      scanf("%d", &tmp);
      Adj[tmp].push_back(i);
    }
  }
  scanf("%d", &num);
  for(int i=0; i<num; i++)
  {
    
    
    int cnt = 0, level[N+1];
    queue<int> q;
    bool inq[maxn] = {
    
    false};
    scanf("%d", &query);
    inq[query] = true;
    q.push(query);
    level[query] = 0;
    while(!q.empty())
    {
    
    
      tmp = q.front();
      q.pop();
      if(level[tmp] >= L)	break;
      for(int i=0; i<Adj[tmp].size(); i++)
      {
    
    
        if(!inq[Adj[tmp][i]])
        {
    
    
          q.push(Adj[tmp][i]);
          inq[Adj[tmp][i]] = true;
          level[Adj[tmp][i]] = level[tmp] + 1;
          cnt++;
        }
      }
    }
    printf("%d\n", cnt);
  }
  return 0;
}

おすすめ

転載: blog.csdn.net/weixin_42393947/article/details/108745295