Ir ao conteúdo

Posts recomendados

Postado

Eu quero resolver o problema 1774 do URI Online Judge.

 

Depois de todas as entradas que faço como no exemplo do problema mostrado, o programa dá esse erro.

 

Meu código:

 

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

struct ArestaPonderada{
    int vertices[2];
    int peso;
};

int r, c;

struct ArestaPonderada *arestas;

void iniciar(){
    int i, j;
    int v, w, p;
    arestas = (int*) malloc(c * sizeof(struct ArestaPonderada));
    for(i = 1; i <= c; i++){
        do{
            scanf("%d %d %d", &v, &w, &p);
        } while(v < 1 || v > r || w < 1 || w > r || p < 1 || p > 10000);
        arestas[i].vertices[1] = v;
        arestas[i].vertices[2] = w;
        arestas[i].peso = p;
    }
}

struct ArestaPonderada* vetorMenor(struct ArestaPonderada ares[]){
    int i;
    bool trocou;
    struct ArestaPonderada aux;
    size_t tam = ((sizeof(ares) / sizeof(struct ArestaPonderada)) / sizeof(int)) / 3;
    struct ArestaPonderada arestaPesos[tam];
    for(i = 1; i <= tam; i++){
        arestaPesos[i].vertices[1] = ares[i].vertices[1];
        arestaPesos[i].vertices[2] = ares[i].vertices[2];
        arestaPesos[i].peso = ares[i].peso;
    }
    // meu método de ordenação que quero criar
    do{
        trocou = false;
        for(i = 1; i <= tam - 1; i++) if(arestaPesos[i].peso > arestaPesos[i + 1].peso){
            aux = arestaPesos[i];
            arestaPesos[i] = arestaPesos[i + 1];
            arestaPesos[i + 1] = aux;
            trocou = true;
        }
    } while(trocou);
    return arestaPesos;
}

struct ArestaPonderada* gerarArvore(struct ArestaPonderada ares[]){
    int i, j, k;
    int visitados[r];
    for(i = 0; i <= r; i++) visitados[i] = -2;
    size_t tam = ((sizeof(ares) / sizeof(struct ArestaPonderada)) / sizeof(int)) / 3;
    struct ArestaPonderada arvore[tam];
    for(i = 1; i <= tam; i++) arvore[i] = ares[i];
    for(i = 1; i <= r; i++) for(j = 1; j <= tam; j++){
        visitados[i] = arvore[j].vertices[1];
        for(k = 1; k <= r; k++) if(visitados[k] == arvore[j].vertices[2]){
            arvore[j].peso = 0;
            break;
        }
        if(arvore[j].peso == 0) continue;
        visitados[i] = arvore[j].vertices[2];
    }
    return arvore;
}

int main(){
    do{
        scanf("%d", &r);
    } while(r < 3 || r > 60);
    do{
        scanf("%d", &c);
    } while(c < r || c > 200);
    iniciar();
    arestas = vetorMenor(arestas);
    arestas = gerarArvore(arestas);
    int i;
    int somaCustos = 0;
    size_t tam = ((sizeof(arestas) / sizeof(struct ArestaPonderada)) / sizeof(int)) / 3;
    for(i = 1; i <= tam; i++) somaCustos += arestas[i].peso;
    printf("%d\n", somaCustos);
}

 

  • Obrigado 1
Postado

Você tem de rever certas coisas em seu código, como por exemplo aquela linha onde está o size_t tam = sizeof(ares)... porque nesse ponto ai onde tem o sizeof(ares) vai dar 8 num pc 64 bits, 8 por ser o tamanho em bytes do ponteiro 'ares'. Eu sugiro que você crie outra struct pra armazenar o tamanho do vetor arestas e também armazenar os ponteiros alocados do tipo ArestaPonderada, aqui uma lista ligada seria suficiente.

 

Observe também na linha com arestas = (int*) malloc(c * sizeof(struct ArestaPonderada)); na função iniciar e em outros lugares também. Aqui você está tentando converter o retorno de malloc para int *, sendo arestas do tipo ArestaPonderada. Pode ser que algum compilador deixe isso passar, mas se for usar o gcc ou algo similar ele vai acusar um erro nesse ponto.

 

E quanto a obter um inteiro negativo, eu diria que é devido acessar áreas de memória não válida, ou seja, era pra ter dado ai o famoso "segment fault" ou outro comportamento inesperado qualquer, nunca se sabe onde um ponteiro não iniciado vai estar apontado caso você não tome as devidas providências, como pré-iniciar com NULL

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!