Grafos

7 respostas
H

Estou tentando implementar um grafo, como não sou muito fera em programação to apanhando um pouquinho. Se alguem puder me ajudar.....

Revirei a net e consegu montar três classes.
public class Vertice {
	
	private String rotulo;
	private int peso;
	int nome;
	
	public Vertice() {
		super();
	}
	
	public String getRotulo() {
		return rotulo;
	}

	public void setRotulo(String rotulo) {
		this.rotulo = rotulo;
	}

	public int getPeso() {
		return peso;
	}

	public void setPeso(int peso) {
		this.peso = peso;
	}

	
	
	
	
}
public class Aresta {

	private String rotulo;
	private Vertice v1;
	private Vertice v2;
	private int peso;

	public Aresta(Vertice v1, Vertice v2) {
		super();
		this.v1 = v1;
		this.v2 = v2;
	}


	public String getRotulo() {
		return rotulo;
	}


	public void setRotulo(String rotulo) {
		this.rotulo = rotulo;
	}


	public Vertice getV1() {
		return v1;
	}


	public void setV1(Vertice v1) {
		this.v1 = v1;
	}


	public Vertice getV2() {
		return v2;
	}


	public void setV2(Vertice v2) {
		this.v2 = v2;
	}

	public int getPeso() {
		return peso;
	}


	public void setPeso(int peso) {
		this.peso = peso;
	}



	public boolean contemAresta(Vertice v1,Vertice v2){
		if((this.v1 == v1)&&(this.v2 == v2))
			return(true);
		if((this.v1 == v2)&&(this.v2 == v1)) 
			return(true);
		return(false);
	}

	public boolean contemVertice(Vertice v){
		if(this.v1 == v) 
			return(true);
		if(this.v2 == v) 
			return(true);

		return(false);
	}

}
import java.util.ArrayList;


public class Grafo {

	private ArrayList arestas;
	private ArrayList vertices;
	private int [][]matrizAdjacencia;
	private int [][] matrizIncidencia;
	private boolean isOrientado;



//	Cria um grafo usando matriz de adjacencia
	public Grafo(int[][] matrizAdjacencias){
		vertices = new ArrayList();
		arestas = new ArrayList();
		this.isOrientado = false;
		for (int i=0;i<matrizAdjacencias.length;i++) {
			this.addVertice();
		}
		for (int i=0;i<matrizAdjacencias.length;i++) {
			for (int j=0;j<matrizAdjacencias.length;j++) {
				if(matrizAdjacencias[i][j]==1){
					Vertice v1 = this.getVertice(i);
					Vertice v2 = this.getVertice(j);
					this.addAresta(v1,v2);
				}
			}
		}
	}



	public Vertice addVertice(){
		Vertice v = new Vertice();
		v.nome = this.getNovoNome();
		v.setRotulo(v.nome+"");
		vertices.add(v);
		this.updateMatrizAdjacencias();
		this.updateMatrizIncidencias();
		return(v);
	}


	public  Aresta addAresta(Vertice _v1, Vertice _v2){
		if(this.getArestaEntreVertices(_v1,_v2)==null){
			Aresta aresta = new Aresta(_v1,_v2);
			arestas.add(aresta);

			this.updateMatrizAdjacencias();
			this.updateMatrizIncidencias();
			return(aresta);
		}
		return(null);
	}

	public Aresta getArestaEntreVertices(Vertice _v1, Vertice _v2){
		Aresta aresta;
		for(int i=0;i<arestas.size();i++){
			aresta = this.getAresta(i);
			if(aresta.contemAresta(_v1,_v2)) 
				return(aresta);
		}
		return(null);
	}


	private int getNovoNome(){
		return(vertices.size()+1);
	}

	public  Vertice getVertice(int i){
		return((Vertice)vertices.get(i));
	}
	public synchronized  Aresta getAresta(int i){
		return((Aresta)arestas.get(i));
	}

	public ArrayList getAdjacencias(Vertice v){
		Aresta aresta;
		ArrayList adjacencias = new ArrayList();
		for(int i=0;i<arestas.size();i++){
			aresta = this.getAresta(i);
			if(aresta.getV1() == v){
				adjacencias.add(aresta.getV2());
			}
			if(aresta.getV2() == v){
				adjacencias.add(aresta.getV1());
			}
		}

		return(adjacencias);
	}


	private  void updateMatrizAdjacencias(){
		Vertice vertice;
		Vertice verticeAux;
		ArrayList v_adjacencias;
		matrizAdjacencia = new int[vertices.size()][vertices.size()];


		for(int i=0;i<vertices.size();i++){
			vertice = this.getVertice(i);
			v_adjacencias = this.getAdjacencias(vertice);
			for(int j=0;j<v_adjacencias.size();j++){
				verticeAux = (Vertice)v_adjacencias.get(j);
				matrizAdjacencia[i][verticeAux.nome-1] = 1;
			}
		}
	}
	private  void updateMatrizIncidencias(){
		Aresta aresta;
		matrizIncidencia = new int[vertices.size()][arestas.size()];

		for(int j=0;j<arestas.size();j++){
			aresta = this.getAresta(j);
			matrizIncidencia[aresta.getV1().nome-1][j] = 1;
			matrizIncidencia[aresta.getV2().nome-1][j] = 1;
		}
	}


	
	public synchronized int getQtdVertices(){
		return(vertices.size());
	}

	public void imprimeGrafo(Grafo grafo){
		int i, j;
		System.out.println(" ");
		for(i=0; i<=(getQtdVertices()-1);i++){
			System.out.println(i);
			System.out.println("\n");
			for(i=0; i<=(getQtdVertices()-1);i++){
				System.out.println(i);
				for(j=0; j<=(getQtdVertices()-1);j++){
					System.out.println(matrizAdjacencia[i][j]);
					System.out.println(matrizIncidencia[i][j]);

				}
			}
		}
	}
}

Bom não entendi direito com a classe grafo funciona e como eu faria para instanciar um grafo na classe main, para testá-lo.

7 Respostas

L

Só para saber onde está sua dúvida… você sabe o que é matriz de adjacência e de incidência?

H

Sim, se eu sei escrever em um papel a matriz de adjacencia ou a de incidencia de um grafo mas não sei implementar

L

Cara, o algorítmo aí recebe no construtor uma matriz de adjacência, a mesma que você escreve no papel… tipo para tu representar neste sistema o grafo, você tem que fazer a matriz de adjacência dele e então passar para o construtor a matriz escrita na linguagem JAVA.

| 0 1 |
| 0 0 |

Seria: new int[][]{{0,1},{0,0}}

Faça um debug e vá passo a passo para ver como funciona, qualquer dúvida pergunte…

Obs.: o método imprimeGrafo não precisa do parâmetro e está bugado, pois não necessariamente a quantidade de vértices é igual a quantidade de arestas, assim não se pode considerar que a matriz de incidência será quadrada e muito menos do mesmo tamanho da matriz de adjacência e, ainda, este método de imprimir o grafo não mostra nada de nada, é só um teste?

Valeu…

H

Realmennte aquele imprime grafo era só um teste. Nem deveria ter colocado ele ali.

Bom já fiz o debug e já vi como funciona.

Fui fazer a classe main para testar.
Só que não consegui instanciar o grafo, pois ela tem como parâmetro uma matriz
Como eu faço?

H

Bom deixa eu ser mais claro

Não sei se estou certo

Vi que faltava um construtor sem parametros na classe grafo

Já coloquei ele lá
import java.util.ArrayList;


public class Grafo {

	private ArrayList arestas;
	private ArrayList vertices;
	private int [][]matrizAdjacencia;
	private int [][] matrizIncidencia;
	private boolean isOrientado;


	/** Cria um Grafo vazio
	    **/
	    public Grafo(){
	        vertices = new ArrayList();
	        arestas = new ArrayList();
	        this.isOrientado=false;
	    }

//	Cria um grafo usando matriz de adjacencia
	public Grafo(int[][] matrizAdjacencias){
		vertices = new ArrayList();
		arestas = new ArrayList();
		this.isOrientado = false;
		for (int i=0;i<matrizAdjacencias.length;i++) {
			this.addVertice();
		}
		for (int i=0;i<matrizAdjacencias.length;i++) {
			for (int j=0;j<matrizAdjacencias.length;j++) {
				if(matrizAdjacencias[i][j]==1){
					Vertice v1 = this.getVertice(i);
					Vertice v2 = this.getVertice(j);
					this.addAresta(v1,v2);
				}
			}
		}
	}



	public Vertice addVertice(){
		Vertice v = new Vertice();
		v.nome = this.getNovoNome();
		v.setRotulo(v.nome+"");
		vertices.add(v);
		this.updateMatrizAdjacencias();
		this.updateMatrizIncidencias();
		return(v);
	}


	public  Aresta addAresta(Vertice _v1, Vertice _v2){
		if(this.getArestaEntreVertices(_v1,_v2)==null){
			Aresta aresta = new Aresta(_v1,_v2);
			arestas.add(aresta);

			this.updateMatrizAdjacencias();
			this.updateMatrizIncidencias();
			return(aresta);
		}
		return(null);
	}

	public Aresta getArestaEntreVertices(Vertice _v1, Vertice _v2){
		Aresta aresta;
		for(int i=0;i<arestas.size();i++){
			aresta = this.getAresta(i);
			if(aresta.contemAresta(_v1,_v2)) 
				return(aresta);
		}
		return(null);
	}


	private int getNovoNome(){
		return(vertices.size()+1);
	}

	public  Vertice getVertice(int i){
		return((Vertice)vertices.get(i));
	}
	public synchronized  Aresta getAresta(int i){
		return((Aresta)arestas.get(i));
	}

	public ArrayList getAdjacencias(Vertice v){
		Aresta aresta;
		ArrayList adjacencias = new ArrayList();
		for(int i=0;i<arestas.size();i++){
			aresta = this.getAresta(i);
			if(aresta.getV1() == v){
				adjacencias.add(aresta.getV2());
			}
			if(aresta.getV2() == v){
				adjacencias.add(aresta.getV1());
			}
		}

		return(adjacencias);
	}


	private  void updateMatrizAdjacencias(){
		Vertice vertice;
		Vertice verticeAux;
		ArrayList v_adjacencias;
		matrizAdjacencia = new int[vertices.size()][vertices.size()];


		for(int i=0;i<vertices.size();i++){
			vertice = this.getVertice(i);
			v_adjacencias = this.getAdjacencias(vertice);
			for(int j=0;j<v_adjacencias.size();j++){
				verticeAux = (Vertice)v_adjacencias.get(j);
				matrizAdjacencia[i][verticeAux.nome-1] = 1;
			}
		}
	}
	private  void updateMatrizIncidencias(){
		Aresta aresta;
		matrizIncidencia = new int[vertices.size()][arestas.size()];

		for(int j=0;j<arestas.size();j++){
			aresta = this.getAresta(j);
			matrizIncidencia[aresta.getV1().nome-1][j] = 1;
			matrizIncidencia[aresta.getV2().nome-1][j] = 1;
		}
	}


	
	public synchronized int getQtdVertices(){
		return(vertices.size());
	}

}
Na classe main eu instanciei um grafo, agora eu quero adicionar os vertices e arestas é nisso que estou com dificuldades
public class Main {


	public static void main(String[] args) {

		Grafo grafo = new Grafo();
		grafo.addVertice();

	}
}
L

Igual eu te falei anteriormente, o método construtor recebe como parâmetro a matriz de adjacência do grafo. Monte a matriz de adjacência do grafo desejado e passe para o construtor, sacou?

new int[][]{{0, 0, 1},{0, 1, 0},{1, 0, 1}}

é o mesmo que a Matriz

| 0 0 1 |
| 0 1 0 |
| 1 0 1 |

ficou mais claro?

H

Ainda não
Eu achava que tinha que adicionar os vertices e as arestas do grafo
Na verdade era isso que eu queria fazer
tipo adiciona o vertice A, B, C, D
Depois adiciona as arestas AB, AC e assim por diante
Em seguida teria um metodo que imprimisse a matriz de adjacencia desse grafo

Criado 30 de março de 2009
Ultima resposta 1 de abr. de 2009
Respostas 7
Participantes 2