This repository has been archived by the owner on Dec 27, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGrafo.java
executable file
·123 lines (102 loc) · 3.26 KB
/
Grafo.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
112
113
114
115
116
117
118
119
120
121
122
123
/*Clase Grafo
Almacena la matriz de adyacencia generada por la relación que implica
el grafo dibujado por el usuario.
No contiene vértices ni aristas.
Determina las propiedades del grafo que genera el usuario.
*/
import java.util.ArrayList;
public final class Grafo {
//Atributos
private final boolean[][] matAdy;
//Métodos
//Constructor
public Grafo(ArrayList<Vertice> vertices, ArrayList<Arista> aristas){
//Creación de matriz adyacencia
matAdy = new boolean[vertices.size()][vertices.size()]; //Se inicializa en false
for (Arista arista : aristas) {
matAdy[vertices.indexOf(arista.getOrigen())][vertices.indexOf(arista.getTerminal())] = true;
matAdy[vertices.indexOf(arista.getTerminal())][vertices.indexOf(arista.getOrigen())] = true;
}
}
//Obtener el grado del grafo
public boolean esTrivial() {
if (matAdy.length == 1) return true; //Si solo hay un vértice es trivial
return false;
}
//Recorrer la matriz en busca de las relaciones
private boolean[] recorridoAnchura(){
//Array visitados inicializados en false
boolean[] visitados = new boolean[matAdy.length];
//El nodo inicial ya esta visitado
visitados[0] = true;
//Cola de visitas de los nodos adyacentes
ArrayList<Integer> cola = new ArrayList<>();
//Se agrega el nodo a la cola de visitas
cola.add(0);
while(!cola.isEmpty()){
int j = cola.remove(0); //Se saca el primero de la cola
//Se busca en la matriz que representa el grafo los nodos adyacentes
for (int i = 0 ; i < matAdy.length ; i++)
//Si un nodo es adyacente y no está visitado entonces
if(matAdy[j][i] == true && !visitados[i]){
cola.add(i); //se agrega a la cola de visitas
visitados[i] = true;
}
}
return visitados;
}
//Determinar si el grafo es conexo
public boolean esConexo(){
if(matAdy.length <= 1) return true;
boolean[] recorrido = recorridoAnchura();
for (boolean bool : recorrido)
if(!bool) return false;
return true;
}
//Determinar si el grafo es disconexo
public boolean esCompleto(){
for(int i = 0 ; i < matAdy.length ; i++)
for (int j = 0 ; j < matAdy.length ; j++)
if(i != j && !matAdy[i][j]) return false;
return true;
}
//Determinar si el grafo tiene Circuito de Euler
public boolean tieneCircuitoEuler(){
for(int i = 0 ; i < matAdy.length ; i++){
int cont = 0;
for (int j = 0 ; j < matAdy.length ; j++)
if(matAdy[i][j]) cont++;
if (cont % 2 != 0) return false;
}
return true;
}
//Determinar si el grafo tiene Recorrido Euleriano
public boolean tieneRecorridoEuler(){
int contImp = 0;
for (int i = 0 ; i < matAdy.length ; i++){
int cont=0;
for (int j = 0 ; j < matAdy.length ; j++)
if(matAdy[i][j]) cont++;
if (cont % 2 != 0) contImp++;
}
return (contImp == 2);
}
//Mostrar Matriz Advertencia
public String mostrarMatrizAdyacencia(){
StringBuilder s = new StringBuilder();
s.append(" ");
for(int i = 0 ; i < matAdy.length ; i++)
s.append(" |").append(i+1).append("|"); s.append('\n');
for(int i = 0 ; i < matAdy.length ; i++){
s.append("|").append(i+1).append("|");
for (int j = 0 ; j < matAdy.length ; j++){
s.append(" ");
if(matAdy[i][j]) s.append(1);
else s.append(0);
if(j < (matAdy[0].length -1)) s.append(" ");
}
s.append('\n');
}
return s.toString();
}
}