1 / 13

Conjuntos Disjuntos

Conjuntos Disjuntos. Monitoria Algoritmos 2012.2. Conjuntos Disjuntos. Breve resumo. Uma coleção de elementos, e cada elemento pertence a um conjunto. Unir elementos é o mesmo que unir os conjuntos os quais eles pertencem. Cada conjunto tem o seu representante. x. y. x U y. 1 4

arien
Download Presentation

Conjuntos Disjuntos

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Conjuntos Disjuntos Monitoria Algoritmos 2012.2

  2. Conjuntos Disjuntos Breve resumo • Uma coleção de elementos, e cada elemento pertence a um conjunto. Unir elementos é o mesmo que unir os conjuntos os quais eles pertencem. Cada conjunto tem o seu representante. x y x U y 1 4 2 3 5 6 1 2 3 4 5 6

  3. Conjuntos Disjuntos x y x U y 1 4 2 3 5 6 1 2 3 4 5 6 Vamos supor que o representante do conjunto x é 1, e o representante do conjunto y é 4. Rep(x) é o representante do conjunto em que x está contido. Rep(1) = Rep(2) = Rep(3) = 1 Rep(4) = Rep(5) = Rep(6) = 4

  4. Conjuntos Disjuntos x y x U y 1 4 2 3 5 6 1 2 3 4 5 6 unir(1,2) = unir(1,3) = unir(2,3) = x unir(4,5) = unir(4,6) = unir(5,6) = y unir(1,4) = unir(1,5) = unir(1,6) = unir(2,4) = ... = unir(3,6) = x U y

  5. Conjuntos Disjuntos Início: 6 conjuntos disjuntos OBS.: a aresta significa quem é o representante do elemento. 1 2 3 4 5 6 Como representar isso em código? publicvoidinit(int N) { for (int i = 1; i <= N; i++) { rep[i] = i; } } //rep[i] indica o representante do elemento i

  6. Conjuntos Disjuntos Vamos utilizar o seguinte algoritmo para união: unir(2,1) publicvoid unir (int i, int j) { rep[i] = j; } 1 3 4 5 6 2 unir(3,2) 1 4 5 6 2 3 Mas peraí, isso é eficiente?

  7. Conjuntos Disjuntos Não! Imagine o caso: unir(2,1), unir(3,2), unir(4,3), unir(5,4), etc. Teríamos uma lista encadeada: 1 2 Se eu quiser saber o conjunto em que o 6 está contido, eu teria que percorrer os 5 elementos acima dele. Esta estratégia é custosa (O(n) por consulta). Precisamos pensar numa estratégia que amortize este custo! 3 4 5 6 ...

  8. Conjuntos Disjuntos E a estratégia nova que iremos adotar é simples! Ao invés de unirmos um elemento diretamente a outro, vamos unir o representante do conjunto de um com o representante do conjunto do outro. Para isso, criaremos uma função recursiva achaConjunto que faz o representante do elemento atual ser igual ao representante do seu atual representante. Isto é: publicintachaConjunto (int i) { if (rep[i] = i) { return i; } else { rep[i] = achaConjunto(rep[i]); return rep[i]; } }

  9. Conjuntos Disjuntos Nossa nova função de unir conjuntos agora será: publicvoid unir (int i, int j) { rep[AchaConjunto(i)] = AchaConjunto(j); } Voltando à simulação em que estávamos antes: 1 3 4 5 6 2 unir(2,3) 3 4 5 6 1 2

  10. Conjuntos Disjuntos unir(2,3) 3 4 5 6 1 2 achaConjunto(2) = 3 3 4 5 6 1 2

  11. Conjuntos Disjuntos unir(1,5) 4 5 6 3 1 2 unir(4,2) 5 6 2 3 4 1

  12. Conjuntos Disjuntos publicvoidinit(int N) { for (int i = 1; i <= N; i++) { rep[i] = i; } } publicintachaConjunto (int i) { if (rep[i] = i) { return i; } else { rep[i] = achaConjunto(rep[i]); return rep[i]; } } publicvoid unir (int i, int j) { rep[achaConjunto(i)] = achaConjunto(j); }

  13. Conjuntos Disjuntos DESAFIO! Há N discos no chão. Cada disco é definido por sua posição (x,y) e seu raio r. Os discos são cobertos de cola, portanto dois discos estão colados se eles se intersectam em pelo menos 2 pontos. Se você levantar um disco do chão, você levantará todos os discos colados a ele, e todos os discos colados aos discos colados a ele, e assim por diante. Dados os N discos, você deverá informar a maior quantidade de discos que se pode levantar de uma vez só segurando um único disco. A entrada é composta por vários casos de teste, e cada caso de teste começa com um inteiro N, e N linhas se seguem, cada uma definindo x, y, r, onde (x,y) é a posição do centro do disco, e r é o raio do mesmo. A entrada deverá ser lida até o N encontrado ser -1. A saída para cada caso de teste é uma linha contendo um único número com a resposta. EXEMPLO INPUT EXEMPLO OUTPUT 3 3.0 2.0 2.0 0.0 -0.5 1.0 0.0 0.0 2.0 2

More Related