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; 
}
Exemple #2
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;
}
Exemple #3
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
            }
        }
    }
}
Exemple #4
0
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;
}
Exemple #5
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 -------");
    
    
}
Exemple #6
0
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
}
Exemple #7
0
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;
    
}
Exemple #8
0
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;
}