CitarUna empresa de analisis de comportamiento humanoa.k.a Facebook


CitarPERO SI NOS DAMOS CUENTA TAMBIEN DEBEN CONOCERSE 1 Y 3 ASI QUE DEBO HACER ALGO MAS.
A lo qu yo entendi esto no es asi, a no ser que este mal redactado o mal traducido. Ya que con solo unir un conjunto de elementos con otros tendrias que agregar todos y cada uno de los elementos a todos los elementos del otro conjunto y viceversa.
Lo que entiendo es que una vez que los vas dando de alta y te pregunten por A o B tu veas si en ese momento se cumple esa relacion "magica" de amistad.
Pero en cualquiera de los casos, Ya sea de la forma en la que tu lo piensas o yo lo estoy pensando. En Ambos se resuelve con un GRAFO.
En tu caso solo es necesario saber si existe una ruta del nodo A al nodo B
y en mi caso si existe y si su profundidad es de al menos 2
Dado que te imponen tiempos y limite de memoria el problema se trata de complejidad de algoritmo...
Se puede resolver usando un Grafo. Se llena un grafo con los saludos y cuando pregunten por X relacion hay que buscar en el grafo si existe un camino del individuo A a B y si es asi evaluar la ruta mas corta si el numero de saltos o nodos entre A y B es menor o igual a 2.
Si esto es asi entonces A y B son amigos.
Tienes que usar el algoritmo de disjktra.
Saludos
Edito acabo de realizar el programa usando una simplicacion de grafos y búsqueda pero tengo una duda.
CitarUn numero en una linea por cada pregunta dada en la entrada con un 1 si es que son amigos y un cero en caso contrario
Ejemplo:
Entrada Salida
0
0
1
1
Límites
Es la salida de tu primer ejemplo?
Ya que no veo como puede estar conectado 2 con 4 o el ultimo caso 5 con 3 (usando solo un conocido en comun)
por cierto el principal problema es la busqueda de la relacion entre los individuos (nodos)
ya que si el peor de los casos tiene 100,000 entradas ai lo buscas iterarivamente 100000 veces vas a tardar mas de 1 segundo por caso.
Mi recomendacion seria combinar alguna otra forma de busqueda mas rapida por ejemplo arboles binarios.
En lo que llegue a mi trabajo pego el codigo.
Saludos
Edito nuevamente (Estos ejercicios me gustan mucho)
Recomiendo generar una entrada que realmente estrese el procesador
Hice este codigo que genera el maximo de 100,000 inputs al azar
Código (c) [Seleccionar]
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX 100000
int main() {
register int i = 0;
srand(time(NULL));
printf("%i %i\n",MAX,MAX);
while(i < MAX) {
printf("%c ",(rand()%2) ? 'P':'S');
printf("%i %i\n",1+ rand()%MAX,1+ rand()%MAX);
i++;
}
}
Y con ese entrada, mi codigo encuentra todas las posibilidades en 1.08 segundos.
La solución que use como les comente es un arbol y búsqueda binaria entre nodos individuales.
No pongo el código del programa por si hay algún otro interesado no afectar su programación.
Saludos!