int main(int argc, char *argv[]) { /*-- Programa principal --*/ /* -- NumVertices: definido antes da leitura das arestas --*/ /* -- NumArestas: inicializado com zero e incrementado a --*/ /* -- cada chamada de InsereAresta --*/ printf("No. vertices:"); scanf("%d%*[^\n]", &NVertices); printf("No. arestas:"); scanf("%d%*[^\n]", &NArestas); Grafo.NumVertices = NVertices; Grafo.NumArestas = 0; FGVazio(&Grafo); for (i = 0; i <= NArestas - 1; i++) { printf("Insere V1 -- V2 -- Peso:"); scanf("%d*[^\n]", &V1); scanf("%d*[^\n]", &V2); scanf("%d*[^\n]", &Peso); getchar(); Grafo.NumArestas++; InsereAresta(&V1, &V2, &Peso, &Grafo); /*1 chamada : G direcionado*/ InsereAresta(&V2, &V1, &Peso, &Grafo); /*2 chamadas: G nao-direcionado*/ } ImprimeGrafo(&Grafo); getchar(); BuscaEmLargura(&Grafo); getchar(); return 0; }
int main() { int vertices, arestas, origem, destino, x, y; int count = 0, aux = 0, valid = 0; TGraph Graph; while(scanf("%d %d", &vertices, &arestas) != EOF) { aux = 0; Graph.NVertices = vertices; Graph.NArestas = 0; CriaGraph(&Graph); for(x = 0; x < arestas; x++) { scanf("%d %d", &origem, &destino); origem--; destino--; InsereAresta(&origem, &destino, &Graph); Graph.NArestas+=2; } valid = Graph.NVertices; for(x = 0; x < Graph.NVertices; x++) { if(ListaAdjVazia(&x,&Graph)) valid--; } for(x = 0; x < Graph.NVertices; x++) { for(y = 0; y < Graph.NVertices; y++) { if(Graph.Matrix[x][y] == 1) { count = 0; RetiraAresta(&x, &y, &Graph); DFS(&Graph, &count); if(count < valid) aux++; InsereAresta(&x, &y, &Graph); } } } fprintf(stdout, "%d\n", (aux/2)); } return 0; }
void ConstroiGrafo(TipoEstacao *Estacao, int numEstacoes, TipoGrafo *Grafo){ int i, j; for(i=0;i<numEstacoes;i++){ for(j=i+1;j<numEstacoes;j++){ if(TemInterferencia(Estacao[i], Estacao[j])){//Caso haja interferência Grafo->NumArestas++; InsereAresta(&i, &j, Grafo); InsereAresta(&j, &i, Grafo);//Duas chamadas, grafo NÃO direcionado } } } }
int main(int argc, const char * argv[]) { Grafo *Mapa = inicia_Grafo(15, 5); InsereAresta(Mapa, 0, 0, 1, 1, 'A'); InsereAresta(Mapa, 1, 1, 2, 1, 'B'); InsereAresta(Mapa, 2, 2, 3, 1, 'C'); InsereAresta(Mapa, 3, 3, 0, 1, 'D'); InsereAresta(Mapa, 4, 4, 0, 1, 'E'); Menu(Mapa); deleta_Grafo(Mapa); return 0; }
void AddCidade (Grafo* Mapa, char comeco) { char fim, aux; int origem, destino, tam, c; origem = tam = 0; destino = -1; for (int i = 0; i <= Mapa->n_nohs; i++) { if(Mapa->grau[i] == 0) { origem = i; break; } } printf("\n\t %c possui caminho para qual cidade? \n ", comeco); printf(">>"); scanf("%c", &fim); getchar(); for (int i = 0; i <= Mapa->nome[i]; i++) { if(Mapa->nome[i] == fim) { destino = i; break; } } if (destino != -1) { printf("\n\t Qual a distancia de %c para %c?\n ", comeco, fim); printf(">>"); scanf("%d", &tam); getchar(); c = InsereAresta(Mapa, tam, origem, destino, 1, comeco); if (c == 1) { printf("\n\n Deseja adicionar mais algum caminho partindo de %c? (S/N) ", comeco); scanf("%c", &aux); getchar(); if (aux == 'S' || aux == 's') { AddCidade(Mapa, comeco); } } } else printf("\n\n ----- Cidades nao existentes -------"); }
void InsereAresta (Grafo* G, int v, int u, int eh_digrafo){ if (G == NULL){ printf("Grafo invalido"); ///***CONDITIONS***//// } ///***CONDITIONS***//// if (v < 0 || u >= G->NV || u < 0 || u >= G->NV){ ///***CONDITIONS***//// printf("Arestas Invalidas"); ///***CONDITIONS***//// } if (G->grau[v]+1 > G->grau_max){ ///***CONDITIONS***//// printf("Voce colocou vertices demais"); ///***CONDITIONS***//// } G->arestas[v][G->grau[v]] = u; // Insert edge in the last position of the array G->grau[v]++; //Increment number of connections if (eh_digrafo == 0) InsereAresta(G, u, v, 1); //If it' double directed do it again, with the numbers inverted }
int InsereAresta(Grafo* mapa, int tam, int origem, int destino, int digrafo, char cidade) { if (mapa == NULL) return 0; // Verifica se o Grafo existe. if (origem < 0 || origem > mapa->n_nohs) return 0; // Verifica se o nó de origem existe dentro do Grafo. if (destino < 0 || destino > mapa->n_nohs) return 0; // Verifica se o nó de destino existe dentro do Grafo. mapa->nohs[origem][mapa->grau[origem]] = destino; // Insere na ultima posicao da lista adjacente de Nós o valor do Destino. mapa->tamanho[origem][mapa->grau[origem]] = tam; // Insere na ultima posicao da lista adjacente de Tamanho o valor do tamanho da aresta. mapa->grau[origem]++; // Incrementa o grau do nó origem. if (digrafo == 1) { InsereAresta(mapa, tam, destino, origem, 0, cidade); // Cosiderando que todo caminho que vai, volta. Precisamos // rodar duas vezes a funcao. Para criar as arestas de ida e volta. mapa->nome[origem] = cidade; } return 1; }
int main(){ FILE *fp; TipoGrafo* grafo; TipoVertice v1, v2; TipoPeso peso; int op, res, num; printf("1- Cria grafo.\n"); printf("2- Insere Aresta.\n"); printf("3- Existe Aresta.\n"); printf("4- Retira Aresta\n"); printf("5- Consulta Aresta\n"); printf("6- Mostra Lista de Adjacentes.\n"); printf("7- Mostra Grafo\n"); printf("8- Libera Grafo\n"); printf("9- Caminho mais curto.\n"); printf("10- Insere Arestas Arquivo.\n"); printf("11- Desativa Estação.\n"); printf("12- Mostrar Estações Desativadas.\n"); printf("13- Caminho mais barato.\n"); printf("0- Sair."); do{ printf("\nEscolha uma opcao:\n"); scanf("%d",&op); switch(op){ case 1:{ printf("\nEscolha o numero de estações:\n"); scanf("%d",&num); grafo = Cria_grafo(num); break; } case 2:{ printf("\nPrimeira estação:\n"); scanf("%d",&v1); printf("\nSegunda estação:\n"); scanf("%d",&v2); printf("\nDistancia:\n"); scanf("%f",&peso.distancia); printf("\nPreco:\n"); scanf("%f",&peso.preco); res = InsereAresta(grafo, v1, v2, peso); if(res == 1){ printf("\nAresta foi inserida.\n"); GravaArestaArquivo(fp, v1, v2, peso); } else{ if(res == 0) printf("\nAresta nao existe.\n"); else printf("\nGrafo nao existe.\n"); } break; } case 3:{ printf("\nEscolha a primeira estação:\n"); scanf("%d",&v1); printf("\nEscolha a segunda estação:\n"); scanf("%d",&v2); res = ExisteAresta(grafo, v1, v2); if(res == 1) printf("\nAresta existe.\n"); else{ if(res == 0) printf("\nAresta nao existe.\n"); else printf("\nGrafo nao existe.\n"); } break; } case 4:{ printf("\nEscolha a primeira estação:\n"); scanf("%d",&v1); printf("\nEscolha a segunda estação:\n"); scanf("%d",&v2); res = RetiraAresta(grafo, v1, v2); if(res == 1) printf("\nAresta foi retirada.\n"); else{ if(res == 0) printf("\nAresta nao existe.\n"); else printf("\nGrafo nao existe.\n"); } break; } case 5:{ printf("\nEscolha a primeira estação:\n"); scanf("%d",&v1); printf("\nEscolha a segunda estação:\n"); scanf("%d",&v2); res = ConsultaAresta(grafo, v1, v2, &peso); if(res == 1) printf("O peso da aresta (%d,%d) = Distancia: %0.2f; Preco: %0.2f\n", v1, v2, peso.distancia, peso.preco); else{ if(res == 0) printf("\nAresta nao existe.\n"); else printf("\nGrafo nao existe.\n"); } break; } case 6:{ printf("\nEscolha a estação:\n"); scanf("%d",&v1); MostraListaAdjacentes(grafo, v1); break; } case 7:{ MostraGrafo(grafo); break; } case 8:{ grafo = LiberaGrafo(grafo); break; } case 9:{ printf("\nEscolha a estação de origem:\n"); scanf("%d",&v1); printf("\nEscolha a estação de destino:\n"); scanf("%d",&v2); Caminho_mais_Curto(grafo, v1, v2); break; } case 10:{ if(InsereArestaArquivo(fp, grafo)) printf("Arestas inseridas"); break; } case 11:{ printf("\nEscolha a estação:\n"); scanf("%d",&v1); res = DesativaVertice(grafo, v1); if(res == 1) printf("Estação %d desativada\n", v1); else{ if(res == 0) printf("\nEstação já estava desativada.\n"); else printf("\nGrafo nao existe.\n"); } break; } case 12:{ VerticesDesativados(grafo); break; } case 13:{ printf("\nEscolha a estação de origem:\n"); scanf("%d",&v1); printf("\nEscolha a estação de destino:\n"); scanf("%d",&v2); Caminho_mais_Barato(grafo, v1, v2); } default: ; } } while(op != 0); return 0; }