PAT Class A 1076 Forwards en Weibo (30 puntos) | Implementación de C ++

1. Descripción del título

原 题 链接
Weibo se conoce como la versión china de Twitter. Un usuario en Weibo puede tener muchos seguidores y también puede seguir a muchos otros usuarios. De ahí que se forme una red social con relaciones de seguidores. Cuando un usuario hace una publicación en Weibo, todos sus seguidores pueden ver y reenviar su publicación, que luego sus seguidores pueden reenviar nuevamente. Ahora, dada una red social, se supone que debes calcular la cantidad máxima potencial de reenvíos para cualquier usuario específico, asumiendo que solo se cuentan L niveles de seguidores indirectos.

Especificación de entrada:

Inserte la descripción de la imagen aquí

Especificación de salida:

Inserte la descripción de la imagen aquí

Entrada de muestra:

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

Salida de muestra:

4
5

Dos ideas para resolver problemas

Dado un punto de partida, la secuencia de capas del gráfico atraviesa el problema. Tenga en cuenta que los datos proporcionados aquí son un usuario que sigue a otros usuarios, no personas que siguen a este usuario, así que preste atención al crear listas de adyacencia. Para cada consulta de entrada, realizamos un recorrido de secuencia de capas (implementado por una cola) y almacenamos el número de capas correspondientes a cada usuario en la matriz de niveles. Después de que sea mayor que la L requerida por la pregunta, se rompe.

Tres, código de CA

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

Supongo que te gusta

Origin blog.csdn.net/weixin_42393947/article/details/108745295
Recomendado
Clasificación