Dijsktra

2 respostas
valramos

Pessoal é o seguinte fiz o algoritmo de dijsktra!

queria colocar as entrada dinamicamente
e as sainda em JOPtionPane!

vou postar os codito aqui!

public class Link {

	private Node origem;
	private Node destino;
	public int peso;

//pegar a distancia
	public Link(Node origem, Node destino, int peso) {

		this.origem  = origem;
		this.destino = destino;
		this.peso    = peso;
	}

	public Node getOrigem() {
		return this.origem;
	}

	public Node getDestino() {
		return this.destino;
	}

	public boolean contains(Node node) {
		return (origem.equals(node) || destino.equals(node));
	}

	public Node getPair(Node node) {
		Node pair = null;
		if (origem.equals(node)) {
			pair = destino;
		} else if (destino.equals(node)) {
			pair = destino;
		}
		return pair;
	}

	public String toString() {
		return "(" + origem.toString() + "," + destino.toString() + "," + peso + ")";
	}

}
public class Node {

	private Object info;
	public Node No;
	public Link[] adjacencias;
	public double distanciaMinima = Double.POSITIVE_INFINITY;
	protected LinkedList<Link> links;

	public Node(Object info) {
		this.info = info;
	}

	public void setInfo(Object info) {
		this.info = info;
	}

	public Object getInfo() {
		return info;
	}

	public String toString() {
		return info.toString();
	}

	public static void main(String[] args) {

	//	String origem, destino;

		// Scanner entrada = new Scanner(System.in);

		 //System.out.println("Informe a Origem: ");

		// origem = entrada.nextLine();

		// System.out.println("Informe o Destino: ");

		// destino = entrada.nextLine();

		// Criando nós

		//
		Node Recife 		= new Node("Recife");
		Node JoaoPessoa 	= new Node("Joao Pessoa");
		Node CampinaGrande 	= new Node("Campina Grande");
		Node Ipojuca 		= new Node("Ipojuca");
		Node Escada 		= new Node("Escada");
		Node Gravata 		= new Node("Gravata");
		Node Vitoria 		= new Node("Vitoria");
		Node Gloria 		= new Node("Gloria");
		Node Bezerros 		= new Node("Bezerros");
		Node Caruaru 		= new Node("Caruaru");
		Node Agrestina	 	= new Node("Agrestina");
		Node SaoCaetano 	= new Node("São Caetano");
		Node Toritama 		= new Node("Toritama");
		Node SantaCruz 		= new Node("Santa Cruz");
		Node Taquaritinga 	= new Node("Taquaritinga");
		Node Surubim 		= new Node("Surubim");
		Node Limoeiro 		= new Node("Limoeiro");
		Node Carpina 		= new Node("Carpina");

		// Raiz
		Grafo mapa = new Grafo(Recife);

		// adocionando no mapa os nós, caso precise criar mais
		mapa.add(Recife, Ipojuca, 40);
		mapa.add(Recife, JoaoPessoa, 100);
		mapa.add(Recife, Vitoria, 40);
		mapa.add(Recife, Carpina, 40);
		mapa.add(JoaoPessoa, CampinaGrande, 100);
		mapa.add(Ipojuca, Escada, 20);
		mapa.add(Vitoria, Carpina, 40);
		mapa.add(Vitoria, Gravata, 40);
		mapa.add(Vitoria, Escada, 30);
		mapa.add(Vitoria, Gloria, 20);
		mapa.add(Gravata, Bezerros, 20);
		mapa.add(Bezerros, Caruaru, 20);
		mapa.add(Caruaru, SaoCaetano, 20);
		mapa.add(Caruaru, Agrestina, 40);
		mapa.add(Caruaru, Toritama, 40);
		mapa.add(Toritama, SantaCruz, 20);
		mapa.add(Toritama, Surubim, 40);
		mapa.add(SantaCruz, Taquaritinga, 20);
		mapa.add(Taquaritinga, Surubim, 40);
		mapa.add(Surubim, CampinaGrande, 80);
		mapa.add(Surubim, Limoeiro, 40);
		mapa.add(Carpina, Limoeiro, 40);
		mapa.add(Limoeiro, Surubim, 40);
		mapa.add(Limoeiro, Gloria, 20);
		
		//mapa.MelhorCaminho(origem, destino);
		
		mapa.MelhorCaminho(Recife, Surubim);

	}	
}
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Scanner;

public class Grafo {
	public static Double Distancia = Double.MAX_VALUE;

	private Node raiz;
	LinkedList<Node> Visitas = new LinkedList<Node>();

	protected LinkedList<Link> links;

	public Grafo(Node root) {
		this.raiz = root;
		this.links = new LinkedList<Link>();
	}

	public void add(Node node, Node node2, int peso) {
		this.links.add(new Link(node, node2, peso));

	}

	public String toString() {
		return "raiz = " + this.raiz.toString() + ". Links: " + this.links;
	}

	public LinkedList<Node> getLinks(Node node) {
		LinkedList<Node> nos = new LinkedList<Node>();
		for (int i = 0; i < this.links.size(); i++) {
			Link link = this.links.get(i);
			if (link.contains(node)) {
				nos.add(link.getPair(node));
			}
		}
		return nos;
	}

	static String Encontrado = "";

	private void CaminhoNo(Node Origem, Node Destino, LinkedList<Node> Lista,
			double soma) {

		double SomaDistancia = soma;

		LinkedList<Node> ListaVisitas = new LinkedList<Node>();

		// Adiciona todos os Nodes do retorno.
		ListaVisitas.addAll(Lista);

		// Verifica se o Node Já existe na lista, caso exista vai para o proximo
		// Node
		if (!ListaVisitas.contains(Origem)) {

			// Caso o Node Não exista na Lista ele é adicionado

			ListaVisitas.add(Origem);

			// Cria um For each percorrendo todos os links existentes
			for (Link DistanciaCaminhos : links) {

				// Se Lista Visitas tiver mais de um iten faz a comparação com
				// links da posicao de "From" com
				// ListaVistas.get(ListaVisitas.size()-2) que sempre sera uma
				// posicao de destino inicial do link
				// e ListaVistas.get(ListaVisitas.size()-1) com a posicao To de
				// Link
				if (ListaVisitas.size() > 1) {

					if (DistanciaCaminhos.getOrigem().equals(
							ListaVisitas.get(ListaVisitas.size() - 2))
							&& DistanciaCaminhos.getDestino().equals(
									ListaVisitas.get(ListaVisitas.size() - 1))) {

						// Se a conexão entre os links existir é somado o peso
						// entre eles.
						SomaDistancia += DistanciaCaminhos.peso;

						// Caso o caminho de Links Venha ser igual ao destino eh
						// impresso na tela
						// a rota feita até o destino e impresso a sua soma de
						// até o ponto de destino.
						if (DistanciaCaminhos.getDestino().equals(Destino)
								&& SomaDistancia < Distancia) {

							Distancia = SomaDistancia;
							Encontrado = "" + ListaVisitas.toString()
									+ "  Distancia " + Distancia + "\n\n";
						}
					}

				}

			}

			LinkedList<Node> ListaNode = new LinkedList<Node>();

			ListaNode.addAll(getLinks(Origem));
			//
			for (int i = 0; i < ListaNode.size(); i++) {

				if ((!ListaNode.get(i).equals(Origem))) {

					// ListaEncontrado.addAll(ListaDestino);

					CaminhoNo(ListaNode.get(i), Destino, ListaVisitas,
							SomaDistancia);

				}
			}
		}

	}

	void MelhorCaminho(Node from, Node to) {

		LinkedList<Node> visitas = new LinkedList<Node>();

		CaminhoNo(from, to, visitas, 0);
		System.out.println("Menor Caminho Encontrado: " + Encontrado);

	}

}

Ufa!! ta ai pra quem quiser estudar ele tb!
queria mostrar o resultado em JOPtionPane
e tb pegar o destino e a origem em JOPtionPane.

Obrigado a que se propuser!!

2 Respostas

E

Eu acharia melhor ler de um arquivo (talvez XML) e gravar em um arquivo HTML. A vantagem de gravar em um arquivo HTML é que você pode abrir esse arquivo com um browser qualquer e deixar formatado bonitinho.
Aliás, é isso que costumo fazer com meus programas que precisam analisar dados: não dá para capturar 100 dados usando JOptionPane.showInputDialog - haja paciência!

valramos

Eu ja estou com os dados por enquanto1
So queria exibir o resultado em JPOtionPane e pegar a origem e o destino e passar com parametro!

Criado 30 de novembro de 2010
Ultima resposta 30 de nov. de 2010
Respostas 2
Participantes 2