Você está na página 1de 7

BACHARELADO EM SISTEMAS DE INFORMAO PROFESSOR: CRSTON PEREIRA DE SOUZA

PROJETO E ANLISE DE ALGORITMOS


Nome: Roberto Cabral Rabelo Filho.

Quixad 2011

Problema do Orkut O problema do Orkut um problema do spoj (corretor de problemas online) que diz que tem uma pessoa que acabou de entrar para o Orkut site de relacionamento e no possui muitos amigos em sua lista de contatos, aps uma pesquisa encontrou antigos amigos de escola que tambm fazem parte do Orkut. Essa pessoa pretende adicionar esses amigos a sua lista de contatos, mas eles decidiram brincar com ela e fazer algumas restries para adicion-la como amiga. Entrada A entrada composta de vrios conjuntos de teste. A primeira linha de um conjunto de teste contm um inteiro N que indica o nmero de antigos amigos da Larissa (1 <= N <= 30). A linha seguinte ir conter N nomes de amigos, separados por espao em branco. Cada nome no ter mais de 15 letras, e sero todos distintos. Nas prximas N linhas sero indicadas as exigncias que a Larissa deve cumprir. Cada linha descreve a exigncia de um amigo e comear com o nome desse amigo, seguido de um nmero M (0 <= M <= N - 1), que indica o nmero de pessoas que aquele amigo quer que a Larissa seja amiga antes, e seguido pelos M nomes de amigos (cada item na linha separado por espao em branco). O final da entrada indicado por N = 0. Exemplo de Entrada 5 Joao Maria Tadeu Jose Ricardo Joao 2 Maria Ricardo Maria 1 Tadeu Jose 1 Joao Tadeu 0 Ricardo 0 3 Joao Maria Renata Maria 1 Joao Joao 1 Renata Renata 1 Maria 0 Exemplo de Sada Teste 1 Ricardo Tadeu Maria Joao Jose Teste 2 Impossvel Restries 0 <= N <= 30 (N = 0 apenas para indicar o fim da entrada) 0 <= M <= N - 1 Cada nome de amigo ter no mximo 15 letras

Resoluo Para resolver esse problema eu o mapeie em um problema estudado em sala de aula que foi a Ordenao topolgica. Nela recebemos um grafo direcionado acclico e retorna uma lista ordenada dos vrtices de modo que, se houver uma aresta (v,u) no grafo, ento v aparecer antes de u na lista. Ou seja, a ordenao topolgica busca um alinhamento dos vrtices do grafo de modo que as arestas apontem da esquerda para a direita:

No nosso problema original podemos ter casos onde impossvel uma maneira de adicionar os amigos atendendo todas as restries. Esses casos ocorrem quando encontramos um ciclo em nosso grafo. Algoritmo de Ordenao Topolgica Tome um vrtice como origem e realize um algoritmo de busca em profundidade a partir deste vrtice. Cada vez que um vrtice encontrado, atualize o valor de incio do vrtice com o prximo valor do contador. Sempre que um vrtice for finalizado, atualize o valor de fim do vrtice com o prximo valor do contador. Quando o algoritmo de busca em profundidade terminar, tome um vrtice ainda no visitado como origem para outro algoritmo de busca em profundidade e continue a incrementar o contador. Continue este processo at que no haja mais vrtices sem terem sido visitados no grafo. Uma ordenao topolgica pode ser obtida pela listagem dos vrtices na ordem inversa de seus valores dos valores de fim atribudos. Este processo de ordenao topolgica funciona porque atribumos o valor do contador quando finalizamos vrtice. Este valor ser maior do que os nmeros atribudos aos vrtices alcanveis por ele, isto , todos os vrtices dos quais ele predecessor na ordenao parcial. Cdigo void bp(int a){ dados[a].cor=CINZA; dados[a].ini=++tempo; for(int i=0;i<d[a];i++){//numero de arestas int u = m[a][i]; if(dados[u].cor==BRANCO){ bp(u); }else if(dados[u].cor==CINZA){ bo=0; break;

} } dados[a].cor=PRETO; resp[r++]=a; dados[a].fim=++tempo; } Anlise de complexidade Nesse algoritmo usamos uma busca em profundidade logo a complexidade do algoritmo vai ser O(numero de vrtices+numero de arestas)

Algoritmo alternativo Depois que fiz o algoritmo de ordenao topolgica para resolver o meu problema eu fiz um algoritmo alternativo para o mesmo problema com o intuito de compara as complexidades e o tempo de execuo para as mesmas entradas. No algoritmo alternativo eu identifico as fontes no grafo, eu defini uma fonte como um vrtice que possui grau de sada igual a zero, encontrada uma fonte eu coloco a mesma na minha soluo a marco como inativa e chamo recursivo para os v-1 vrtices. Anlise de complexidade do algoritmo alternativo No algoritmo que eu implementei temos a seguinte recorrncia T(v) = T(v-1)+O(v) Pois eu chamo recursivo para os (n-1) vrtices e em cada chamada eu executo O(v) para encontrar a prxima fonte e atualizar os vrtices. Ficando a complexidade do meu algoritmo O(v). Anlise de tempo A anlise de tempo desse algoritmo no saiu como eu pretendia, pois tive problema na hora de gerar entradas aleatrias, pude imaginar a discrepncia nos dois algoritmos vendo meus algoritmos do buraco minhoca, pois a complexidade a mesma O(vrtices + arestas) e a do alternativo O(n) que ainda melhor que o alternativo do Orkut, mesmo assim a diferena foi de 48 segundos.

Problema buracos de minhoca Os chamados buracos de minhoca (em ingls, worm holes) so ligaes entre dois pontos do espao que permitem que um corpo desloque-se de um ponto ao outro instantaneamente. Embora atualmente sejam apenas parte de uma teoria, acredita-se que no futuro viajaremos atravs do espao rapidamente utilizando buracos de minhoca. O principal problema tecnolgico a ser resolvido na construo de um buraco de minhoca a enorme quantidade de energia envolvida. Uma dificuldade adicional que buracos de minhoca so unidirecionais. Ou seja, um buraco que leve do ponto A ao ponto B no pode ser utilizado para ir do ponto B ao ponto A. Tarefa Escreva um programa que, dado um mapa de buracos de minhoca interligando os planetas, determine se possvel, a partir de qualquer um dos planetas, viajar, atravs de buracos de minhoca, at qualquer outro planeta. Entrada A entrada composta de vrios conjuntos de teste. A primeira linha de um conjunto de teste contm dois nmeros inteiros P e B, representando respectivamente o nmero de planetas (1 <= P <= 3000) e o nmero de buracos de minhocas do mapa (1 <= B <= 150000). Os planetas so identificados por nmeros de 1 a P . Cada uma das B linhas seguintes contm dois inteiros X e Y , separados por espao em branco, representando a existncia de um buraco de minhoca que permite ir do planeta X para o planeta Y (1 <= X <= P , 1 <= Y <= P e X != Y ). O final da entrada indicado por P = B = 0. Sada Para cada conjunto de teste da entrada seu programa deve produzir trs linhas na sada. A primeira linha deve conter um identificador do conjunto de teste, no formato Teste n, onde n numerado seqencialmente a partir de 1. A segunda linha deve conter uma unica letra: S se possvel viajar de qualquer planeta para qualquer outro planeta, ou N caso contrrio. A terceira linha deve ser deixada em branco. A grafia mostrada no Exemplo de Sada, abaixo, deve ser seguida rigorosamente. Exemplo Entrada: 34 12 32 13 23 34 23 32 12 31 00

Sada: Teste 1 N Teste 2 S

Restries 1 <= P <= 3000 (P = 0 para indicar final da entrada) 1 <= B <= 150000 (B = 0 para indicar o final da entrada) 1 <= X <= P 1 <= Y <= P X != Y Resoluo Podemos entender esse problema como um problema de grafo fortemente conexo. Um grafo dito ser fortemente conexo se todo par de vrtices est ligado por pelo menos um caminho em cada sentido, ou seja, se cada par de vrtices participa de um circuito. Isto significa que cada vrtice pode ser alcanvel partindo-se de qualquer outro vrtice do grafo.

Para resolver esse problema eu usei uma variao de um algoritmo estudado em sala de aula. Em sala de aula vimos um algoritmo que mostrar todas as componentes fortemente conexas. Para ele fazer isso ele faz uma busca em profundidade guardando o tempo em que o n foi encerrado (quando o n fica preto), depois feito mais uma busca em profundidade, mas agora no grafo transposto ao grafo de entrada (com as direes invertidas) e essa segunda busca feita na ordem decrescente aos ns encerrados. O algoritmo que usei no necessita guardar esses tempos, pois no problema que eu queria resolver eu tinha apenas que dizer se o grafo todo conexo ou no, logo basta eu fazer uma busca em profundidade para ver se eu alcano todos os vrtices e se eu alcanar fao uma busca no grafo transposto e verifico se ele uma componente fortemente conexa s.

Anlise de complexidade Nesse algoritmo, como no algoritmo do Orkut, usamos uma busca em profundidade logo a complexidade do algoritmo vai ser O(numero de vrtices+numero de arestas) Algoritmo Alternativo No meu algoritmo alternativo eu fiz uma busca em profundidade em casa vrtice do grafo e verifico em cada busca se eu consigo chegar a todos os vrtices do meu grafo, se eu conseguir saindo de todos os vrtices chegar a todos os vrtices meu grafo vai ser fortemente conexo. Anlise de complexidade do algoritmo alternativo A complexidade do meu algoritmo alternativo o O(vertices). Anlise de tempo Nesse problema foi possvel perceber claramente a discrepncia entre os dois algoritmos, pois com a entrada de 3000 vrtices e 150000 arestas que o limite superior que o problema pede o meu algoritmo executou em 0 segundo, enquanto o alternativo levou 48 segundos.