Seis grados de espacio (30 puntos) (BFS)

La teoría de los "Seis grados de separación" también se denomina teoría de los "Seis grados de separación". Esta teoría puede expresarse fácilmente como: "No hay más de seis personas entre tú y un extraño. Es decir, puedes conocer a cualquier extraño a través de un máximo de cinco personas". Como se muestra en la Figura 1..
Inserte la descripción de la imagen aquí
Figura 1 Diagrama esquemático del espacio de seis dimensiones

Aunque la teoría del "espacio de seis dimensiones" ha sido ampliamente reconocida, cada vez tiene más aplicaciones. Pero durante décadas, intentar verificar esta teoría siempre ha sido el objetivo de muchos sociólogos. Sin embargo, por razones históricas, esta investigación tiene demasiadas limitaciones y dificultades. Dado que el contacto de la gente contemporánea se basa principalmente en herramientas como llamadas telefónicas, mensajes de texto, WeChat y mensajería instantánea en Internet, los datos primarios que pueden reflejar las relaciones de las redes sociales han hecho posible verificar gradualmente la teoría del "espacio de seis dimensiones".

Si se le proporciona un gráfico de red social, calcule el porcentaje de nodos que se ajustan a la teoría del "espacio de seis dimensiones" respecto al número total de nodos de cada nodo.

Formato de entrada:
ingrese la primera línea para obtener dos números enteros positivos, que representan respectivamente el número de nodos en el gráfico de la red social N (1 <N≤10
3
, que indica el número de personas) y el número de lados M (≤33 × N, que indica el número de relación social). Las siguientes M filas corresponden a M aristas, y cada fila da un par de números enteros positivos, que son los números de los dos nodos conectados directamente a la arista (los nodos se numeran de 1 a N).

Formato de salida:
Para cada nodo, genere el porcentaje del número de nodos cuya distancia desde el nodo no es más de 6 al número total de nodos, con una precisión de 2 decimales. Cada nodo genera una línea, el formato es "número de nodo: (espacio) porcentaje%".

Muestra de entrada:

10 9
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10

Salida de muestra:

1: 70.00%
2: 80.00%
3: 90.00%
4: 100.00%
5: 100.00%
6: 100.00%
7: 100.00%
8: 90.00%
9: 80.00%
10: 70.00%

Idea de la pregunta:
1. La pregunta es muy clara, la esencia es que el límite de aplicación del algoritmo BFS es de solo 6 capas.
2. Los comentarios del código están escritos con mucha claridad. Mire los comentarios de cada oración para obtener más detalles. Si aún no entiende, puede comentar el mensaje a continuación o enviarme un mensaje privado, y le responderé tan pronto como posible

#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int n, m;
int Visited[1005] = {
    
     0 };	//标志一个点有没有被访问过的数组
vector<int> Graph[1005];	//用vector容器建图,效率高,方便快捷。
int BFS(int index);		
int main()
{
    
    
	cin >> n >> m;
	int a, b;
	while (m--)				//建图
	{
    
    
		cin >> a >> b;
		Graph[a].push_back(b);
		Graph[b].push_back(a);
	}

	for (int i = 1; i <= n; i++)		//这道题目是下标从1开始,其他题目可能变一下从0开始,或者节点都是字母,如果是字母可以采用map映射一下
		printf("%d: %.2lf%%\n", i, BFS(i) * 1.0 / n * 100.0);


	return 0;
}
int BFS(int index)
{
    
    
	fill(Visited, Visited + 1005, 0);	//每次BFS一个点以后都要把Visited数组必须重新置为零,便于后续使用
	queue<int> que;		
	que.push(index);		
	int head = index;					//将当前顶点做标记,
	int lev = 0, ret = 0;				//层数和查找到的个数

	while (!que.empty() && lev != 6)	
	{
    
    
		int t = que.front();
		que.pop();
		for (int i = 0; i < Graph[t].size(); i++)
		{
    
    
			if (!Visited[Graph[t][i]])	//如果没有访问过
			{
    
    
				que.push(Graph[t][i]);	//入队
				Visited[Graph[t][i]] = 1; 
				ret++;
			}
		}

		if (t == head)				//这一个if是判断这一层是不是遍历完的标志,在纸上画一画,很重要。
		{
    
    
			head = que.back();		
			lev++;
		}
	}
	return ret;
}

Supongo que te gusta

Origin blog.csdn.net/xdg15294969271/article/details/114117831
Recomendado
Clasificación