Aqui está o método para preencher o grafo a partir de um arquivo de texto.
O arquivo deve seguir o seguinte padrão para que seja interpretado corretamente:
N
p0
p1
p2
...
pN-1
A
X Y P D
X Y P D
X Y P D
X Y P D
X Y P D
- N - número de nós que o grafo irá conter
- p0 ~ pn-1 - o peso de cada nó a ser inserido
- A - número de arestas a serem inseridos no grafo
- X, Y - coordenadas do da aresta a ser inserida
- P - Peso da aresta
- D - Diz se a aresta é direcional(1) ou não (0)
Um exemplo de arquivo válido:
2
1
2
4
0 0 2 1
0 1 1 1
1 0 5 1
1 1 6 1
O seguinte formato de arquivo também é válido, mas não é bom usar pois é difícil identificar os itens do arquivo
2 1 2 4 0 0 2 1 0 1 1 1 1 0 5 1 1 1 6 1
O método para ler arquivos:
void Grafo::readFile(string filename){
ifstream arquivo (filename.c_str());
if( arquivo.is_open()){
int contador, temp, x, y, p;
arquivo >> qtdnos;
dimensionar(qtdnos);
for( int i = 0; i < qtdnos; i++)
arquivo >> pesos[i];
arquivo >> contador;
for(int i = 0; i < contador; i++){
arquivo >> x >> y >> p >> temp;
setAresta(x,y,p);
if(temp == 0)
setAresta(y,x,p);
}
} else {
cout << "erro: arquivo inexistente/inválido" << endl;
}
}
O método recebe o nome do arquivo como parametro (uma string) e tenta abri-lo. Caso consiga, ou seja, caso o arquivo exista, é iniciada a interpretação do arquivo na seguinte lógica:
- É lida a primeira linha, que contém o numero de nós do grafo. Com isso ele é redimensionado pelo método dimensionar(int tamanho)
- Na próximas N linhas (N sendo a quantidade de nós lido) são lidos e armazenados os pesos de cada nó.
- Assim que a última linha de pesos for lida, é lido a quantidade de arestas a serem inseridas na matriz de adjacência do grafo
- Cada linha que contém as informações da aresta é lida a aresta adicionada conforme o peso. Caso a aresta não seja direcional(0), uma nova aresta com o mesmo peso é inserido nas coordenadas inversas (se as coordenadas era 1,2 e a aresta não é direcional, uma nova aresta é colocada em 2,1)
Usando exemplo de arquivo de entrada dado aqui, o grafo é preenchido desta maneira:
Matriz
0 1
0|2 1
1|5 6
Pesos
0|1|
1|2|
A saída acima foi gerada usando o método showAll(). Para ficar mais legível, alteramos um pouco o método os métodos showPesos() e showMatriz(), além de adicionar um teste em showAll() para verificar se o grafo está vazio ou não
void Grafo::showMatriz(){
cout << " ";
for(int i = 0; i < qtdnos; i++)
cout << i << " ";
cout << endl;
for(int i = 0; i < qtdnos; i++){
cout << i << "|";
for (int j = 0; j < qtdnos; j++){
cout << matriz[i][j] << " ";
}
cout << endl;
}
}
void Grafo::showPesos(){
for(int i = 0; i < qtdnos; i++)
cout << i << "|";
cout << endl;
for(int i = 0; i < qtdnos; i++)
cout << pesos[i] << "|";
cout << endl;
}
void Grafo::showAll(){
if(qtdnos != 0){
cout << "Matriz" << endl;
showMatriz();
cout << "Pesos" << endl;
showPesos();
} else {
cout << "Grafo vazio"<< endl;
}
}
O código fonte da classe grafo com todas as alterações até agora pode ser baixado aqui.
Nenhum comentário:
Postar um comentário