@param args the command line arguments
*/
public static void main(String[] args) {
String cidade = null;
String nCidade;
String nHabitantes;
String prefeito;
String Vizinho;
String cidadeInicial;
String cidadeAtual;
int x = 0, cont =1;
String Cidade = JOptionPane.showInputDialog(null, “ESCOLHA A OPÇÃO DESEJADA”
+ “\n1) CADASTRAR CIDADE”
+ “\n2) MOSTRA CIDADES CADASTRADAS”
+ “\n3) ESCOLHA A CIDADE”
+ “\n4) MENOR CAMINHO”,“CIDADE VIZINHA”, JOptionPane.PLAIN_MESSAGE);
do {
if(Cidade.toUpperCase().equals(“1”)){
nCidade = JOptionPane.showInputDialog(null,"Nome Da Cidade: ",“CADASTRO”, JOptionPane.PLAIN_MESSAGE);
nHabitantes = JOptionPane.showInputDialog(null,"QUANTIDADE DE HABITANTES: ",“CADASTRO”, JOptionPane.PLAIN_MESSAGE);
prefeito = JOptionPane.showInputDialog(null,"NOME DO PREFEITO: ",“CADASTRO”, JOptionPane.PLAIN_MESSAGE);
Vizinho = JOptionPane.showInputDialog(null,"VIZINHOS: ",“CADASTRO”, JOptionPane.PLAIN_MESSAGE);
x = Integer.parseInt(JOptionPane.showInputDialog(null,“Digite a tecla 1 para sair ou 0 para cadastrar outra cidade”));
}cont++;
}while ((x==0)&&(cont<=7));
if(Cidade.toUpperCase().equals(“2”)){
}
switch (cidade) {
case ‘A’: cidadeAtual = Vizinho b & c;
break;
case ‘B’: cidadeAtual = Vizinho c & e;
break;
case ‘C’: cidadeAtual = Vizinho d & b;
break;
case ‘D’: cidadeAtual = Vizinho e & c;
break;
case ‘E’: cidadeAtual = Vizinho F & D;
break;
case ‘F’: cidadeAtual = Vizinho e & g;
break;
case ‘G’: cidadeAtual = Vizinho f;
public class Vertice {
private final String referencia;
private float peso;
private final ArrayList arestas = new ArrayList<>();
private String caminho = null;
public Vertice(String referencia) {
this.referencia = referencia;
}
public String getReferencia() {
return referencia;
}
public float getPeso() {
return peso;
}
public void setPeso(float peso) {
this.peso = peso;
}
public ArrayList<Aresta> getArestas() {
return arestas;
}
public int compareTo(Vertice outroVertice) {
return Float.compare(peso, outroVertice.peso);
}
public static void menorCaminho(Vertice origem, Vertice destino, ArrayList<Vertice> grafo) {
//primeiro todos os pesos do grafo são declarados como o maior valor possível
grafo.forEach(vertice -> {
vertice.peso = Float.POSITIVE_INFINITY;
});
//a variável origem deve estar contida no grafo e o peso dela é inicializado com 0
origem.setPeso(0);
origem.caminho = origem.referencia;//inicializando o caminho
//vamos precisar de SOMENTE uma lista para atualizar o peso dos vértices
ArrayList<Vertice> fila = new ArrayList<>(grafo);//todos os vertices foram adicionados à "FILA"
//enquanto houver elementos na fila removemos o elemento com o menor peso e atualizamos os demais
while (!fila.isEmpty()) {
Vertice menor = verticeMaisLeve(fila);
//vamos procurar os vertices vizinhos utilizando a referência como parâmetro
for (Aresta aresta : menor.getArestas()) {//para cada aresta
for (Vertice vertice : grafo) {//verificamos cada vertice no grafo, ou seja não verifico a fila e sim o grafo
if (vertice.getReferencia().equals(aresta.getReferencia())) {//filtro para atualização dos pesos pela referencia
if (vertice.peso > menor.peso + aresta.getDistancia()) {
vertice.setPeso(menor.peso + aresta.getDistancia());
vertice.caminho = menor.caminho + " > " + vertice.referencia;
}
break;
}
}
}
}
JOptionPane.showMessageDialog(null, "MENOR CAMINHO DE "+origem.getReferencia()+" a "
+ destino.referencia+"\n"+(destino.caminho == null? "As cidades não se comunicam ":destino.caminho)+" \n");
}
private static Vertice verticeMaisLeve(ArrayList<Vertice> fila) {
//como implementamos o comparable, podemos usar ordenar a coleção com ferramentas do java
Collections.sort(fila);//ordenando a fila de acordo com o peso de cada vétice
return fila.remove(0);//retornamos o menor elemento da fila e o removemos da fila (obs.: em uma instrução)
}