-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAlgoritmoEstruturaConjuntosDisjuntos.java
111 lines (95 loc) · 3.05 KB
/
AlgoritmoEstruturaConjuntosDisjuntos.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package Trabalho2;
import java.util.LinkedList;
public class AlgoritmoEstruturaConjuntosDisjuntos {
private LinkedList<LinkedList> listaDeConjuntos;
// construtor
public AlgoritmoEstruturaConjuntosDisjuntos(Grafo g) {
listaDeConjuntos = new LinkedList<>();
CONNECTEDCOMPONENTS(g);
ordenaConjuntos();
}
// get lista
public LinkedList<LinkedList> getLista() {
return listaDeConjuntos;
}
// set lista
private void setLista(LinkedList<LinkedList> lista) {
this.listaDeConjuntos = lista;
}
// Define quantas e quais sao as componentes conexas
private void CONNECTEDCOMPONENTS(Grafo g) {
// Define um conjunto para cada vertice do grafo
for (Vertice v : g.getListaVertices()) {
makeSet(v.getNome());
}
for (Vertice v : g.getListaVertices()) {
// Para cada adjacente de cada vertice faz-se a uniao de conjuntos caso ainda
// nao tenha sido feita
for (Vertice a : v.getAdjacente()) {
if (!find(a.getNome()).equals(find(v.getNome()))) {
union(a.getNome(), v.getNome());
}
}
}
}
// makeSet
private void makeSet(int vertice) {
// Add na lista de conjuntos uma lista (conjunto) para cada vertice
// Cada uma destas lista tem como conteudo o proprio vertice
// Isso sao conjuntos de um elemento
LinkedList<Integer> conjunto = new LinkedList<>();
conjunto.add(vertice);
getLista().add(conjunto);
}
// find
private LinkedList<Integer> find(int vertice) {
// Retorna a lista (conjunto) que o vertice se encontra
for (LinkedList<Integer> c : getLista()) {
if (c.contains(vertice)) {
return c;
}
}
return null;
}
// union
private void union(int vertice1, int vertice2) {
// Encontra-se as listas (conjuntos) dos vertices recebidos
LinkedList<Integer> l1 = find(vertice1);
LinkedList<Integer> l2 = find(vertice2);
// Remove-se essas listas (conjuntos) da lista de conjuntos
getLista().remove(l1);
getLista().remove(l2);
// Repassamos todos elementos de uma das listas (conjuntos) para a outra(o)
for (Integer v : l1) {
l2.add(v);
}
// Add essa lista com os elementos de ambas a listas (conjuntos) na lista de conjuntos
getLista().add(l2);
}
// Metodo para ordenar os conjuntos para a impressao
private void ordenaConjuntos() {
LinkedList<Integer> aux = new LinkedList<>();
LinkedList<LinkedList> novaLista = new LinkedList<>();
// Ordena em ordem crescente os vertices das listas (conjuntos) da lista de conjuntos
// Adiciona na lista auxiliar o primeiro vertice de cada lista (conjunto) da lista de conjuntos
// Esses vertices possuem o menor valor de cada lista (conjunto)
for (LinkedList<Integer> c : getLista()) {
c.sort(null);
aux.add(c.getFirst());
}
// Ordena em ordem crecente a lista aux
aux.sort(null);
// Adiciona na nova lista as listas (conjuntos) da lista atual conforme a ordem da lista aux
for (Integer v : aux) {
for (LinkedList<Integer> c : getLista()) {
if (c.contains(v)) {
novaLista.add(c);
getLista().remove(c);
break;
}
}
}
// Faz um setLista que recebe como parametro a nova lista
setLista(novaLista);
}
}