Boas, eu tenho um projecto sobre grafos que possui um vector de vertices e cada vertice tem uma LinkedList de arcos , eu preciso de fazer um método que imprima todos os arcos do grafo, eu estava fazendo um método que percorria vertice a vertice e sacava todos os arcos para uma string, o problema é k por exemplo um arco que vai do vertice 1 para o vertice 2 , vai aparecer kuando eu sacar os arcos do vertice 1 e kuando eu sacar do vertice 2.
Alguém já fez algo parecido ? ou tem alguma ideia ?
como que está o seu código atual para armazenar e
representar os seus vértices e seus arcos?
você já tentou montar algum algoritmo de percurso?
mande os códigos ae para o pessoal sugerir algumas
ideias
abraços
S
saundePJ
Aqui vai…
Class Vertice
importjava.util.*;publicclassVertex{privateStringid;// id do vérticeprivateintindex;privateLinkedList<WeightedEdge>edges;// contêm a lista de arcos q têm origem neste vérticepublicVertex(Stringid,intindex){edges=newLinkedList<WeightedEdge>();this.id=id;// identificador do vérticethis.index=index;// indice onde o vértice se encontra no grafo}//Adiciona um novo arco a edges, com origem neste // vértice, fim e peso passados como parâmetros publicbooleanaddEdge(Vertexd,intp){WeightedEdgewe=newWeightedEdge(this,d,p);return(edges.add(we));// como o método add é boolean vai retornar true se for adicionado}//retorna true se o objecto referencia um vértice, caso contrário é falsopublicbooleanequals(Objecto){if(oinstanceofVertex){Vertexv=(Vertex)o;if(this.id==v.id)returntrue;}returnfalse;}//Percorre a lista de arcos e retorna um iterador para os vértices publicVertexIteratorgetEdgesIterator(){VertexIteratorvI=newVertexIterator();returnvI;}// retorna o id do vérticepublicStringgetId(){returnid;}//retorna o index do vértice publicintgetIndex(){returnindex;}//remove um arco da lista de arcos deste mesmo vérticepublicbooleanremoveEdge(WeightedEdgea){Iteratorit=edges.listIterator();while(it.hasNext()){if(a.equals(it.next())){it.remove();returntrue;}}returnfalse;}//retorna o id do vérticepublicStringtoString(){returngetId();}//Inner Class //Classe VertexIterator, percorre os vértices dos arcos da lista publicclassVertexIteratorimplementsIterator{Iteratorit=edges.listIterator();//testa se há seguintepublicbooleanhasNext(){return(it.hasNext());}//retorna o próximo elementopublicVertexnext(){WeightedEdgewe=(WeightedEdge)it.next();returnwe.getEnd();}//remove um arcopublicvoidremove(){it.remove();}}privateWeightedEdge[]vEdges;publicVector<WeightedEdge>vertexGetEdge(){Vector<WeightedEdge>vEdges=newVector<WeightedEdge>();Iteratorit=edges.listIterator();WeightedEdgewe=null;while(it.hasNext()){we=(WeightedEdge)it.next();vEdges.add(we);}returnvEdges;}}
Class Arco
publicclassWeightedEdge{privateintweight;//peso do arcoprivateVertexinit,end;//vértice de inicio e fim do arco//cria um arco com inicio em vo, fim em vd e peso p publicWeightedEdge(Vertexvo,Vertexvd,intp){this.init=vo;this.end=vd;this.weight=p;}// retorna true se o objecto ref arco igual,false caso contrário//2 arcos são iguais se ligarem os mesmos vérticespublicbooleanequals(Objecto){if(oinstanceofWeightedEdge){WeightedEdgewe=(WeightedEdge)o;if((this.init==we.init)&&(this.end==we.end))returntrue;}returnfalse;}//retorna o vértice de destino do arcopublicVertexgetEnd(){return(this.end);}//retorna o vértice de origem do arcopublicVertexgetInit(){return(this.init);}//retorna o peso do arcopublicintgetWeight(){returnweight;}//exibe o arco e os seus parâmetrospublicStringtoString(){return"("+this.init+","+this.end+","+this.weight+")";}}
Class Grafo
importjava.util.Vector;publicclassGraph{privateVector<Vertex>vertices;// contém os vértices do grafo// construtor do grafopublicGraph(){vertices=newVector<Vertex>();}/* * adiciona um arco ao vertice do grafo com id = id1, um arco que termina no * vértice com id=id2 e peso w */publicbooleanaddEdge(Stringid1,Stringid2,intw){Vertexv1=this.get(id1);Vertexv2=this.get(id2);if(v1.addEdge(v2,w)&&v2.addEdge(v1,w))returntrue;returnfalse;}/* * retorna o vértice do grafo com id igual ao recebido como parametro ou * null caso não exista */publicVertexget(Stringid){for(inti=0;i<vertices.size();++i){if(vertices.elementAt(i).getId().equals(id)){returnvertices.get(i);}}returnnull;}/* retorna o vértice do gráfico com index igual ao passado * por parametro ou null caso não exista */publicVertexget(intv){for(inti=0;i<vertices.size();++i){if(vertices.elementAt(i).getIndex()==v){returnvertices.get(i);}}returnnull;}//retorna os ids dos vértices publicStringidsVertices(){Stringid="";Stringaux="";for(inti=0;i<vertices.size();++i){aux=vertices.elementAt(i).getId();id+=" "+aux;}returnid;}//retorna o número de verticespublicintgetSize(){returnvertices.size();}// public boolean removeEdge(WeightedEdge e){// return true; //mudar// }// public String toString() {// String aux="";// String st="";// for (int i = 0; i < vertices.size(); ++i) {// Vertex v = vertices.elementAt(i);// aux = v.vertexToEdge();// st+=aux;// }// return "["+st+ "]";// }/* * retorna o vértice do grafo com id igual ao recebido como parametro, caso * não exista um vertice com este id adiciona ao grafo um novo vértice com * este id e index igual à posição em que foi adicionado */publicVertexvertex(Stringid){for(inti=0;i<vertices.size();++i){if(vertices.elementAt(i).getId().equals(id)){returnvertices.get(i);}}Vertexver=newVertex(id,vertices.size());vertices.add(ver);returnver;}}