Ir ao conteúdo
  • Cadastre-se
Tlrc

C++ Problema de grafo, código para de compilar

Recommended Posts

Estou com um problema nesse código em  quando eu aciono a função troca o código para a compilação queria muito saber o problema,agradeço desde já.

 

#include<bits/stdc++.h>
using namespace std;
int npre=1,menor=101;
const int k=501;
int pre[k],idade[k];
class grafo{
int v;
list<int> *adj;
public:
grafo(int v);
void adicionararesta(int v1,int v2);
void troca(int v1,int v2);
void dfs(int x);
};
grafo::grafo(int v){
    this->v=v+1;
    adj= new list<int>[v+1];
}
void grafo::adicionararesta(int v1,int v2){
    adj[v2].push_front(v1);
}
void grafo::troca(int v1,int v2){
    adj[v1].swap(adj[v2]);
    for(int i=1;i<k+1;i++){
        if(i==v1) continue;
        if(i==v2) continue;
        for(list<int>:: iterator it=adj.begin();it!=adj.end();it++){
            if(*it==v1)*it=v2;
            else if(*it==v2)*it=v1;
        }
    }
}
void grafo::dfs(int x){
    pre[x]=npre++;
    for(int w:adj[x]){
        if(pre[w]==-1) dfs(w);
        if(idade[w]<menor) menor=idade[w];
    }
}

int main(){
 int k,r,a,b,c;//K=n vertice,r=n relacoes,c= n comandos
 cin>>k>>r>>c;
 grafo grafo(k+1);
 for(int i=1;i<k+1;i++){
     cin>>idade;
 }
 for(int i=0;i<r;i++){
     cin>>a>>b;
     grafo.adicionararesta(a,b);
 }
    while(c--){
        char cmd;
        cin>>cmd;
        if(cmd=='T'){
            cin>>a>>b;
            grafo.troca(a,b);
        }
        else{
            memset(pre,-1,sizeof(pre));
            npre=1;
            menor=101;
            cin>>a;
            grafo.dfs(a);
            if(menor!=101) cout<<menor;
            else cout<<"*";
        }
    }
    return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

O programa tem vários erros de programação. Você copiou e colou sem ler o programa ? 

por exemplo, você faz uso de uma variável chamada "idade" mas não a declarou. Isso acontece na linha 54. Mesmo que declare a variável idade, ela está dentro de um loop e não faz o menor sentido ler várias idades. O loop apenas lê a variável, faz nada com ela.

 

Recomendo rever esse conceito.

 

adicionado 22 minutos depois
Em 28/04/2018 às 16:20, Tlrc disse:

 cin>>k>>r>>c;

Este é o primeiro input do programa. Mas do que se trata ? Você num dá dica nenhuma. São tres variáveis que precisam ser digitadas pelo usuário. Mas o que elas significam ? 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, copiei o código errado me desculpe, a respeito dessas variáveis sem "dicas",é porque isso se trata de um código para competição,não para uma empresa então eu tenho que fazer o mais rápido possível e o usuário não precisa de "dicas".

#include<bits/stdc++.h>
using namespace std;
int npre=1,menor=101;
const int k=501;
int pre[k],idade[k];
class grafo{
int v;
list<int> *adj;
public:
grafo(int v);
void adicionararesta(int v1,int v2);
void troca(int v1,int v2);
void dfs(int x);
};
grafo::grafo(int v){
    this->v=v+1;
    adj= new list<int>[v+1];
}
void grafo::adicionararesta(int v1,int v2){
    adj[v2].push_front(v1);
}
void grafo::troca(int v1,int v2){
    adj[v1].swap(adj[v2]);
    for(int i=1;i<k+1;i++){
        if(i==v1) continue;
        if(i==v2) continue;
        for(list<int>:: iterator it=adj.begin();it!=adj.end();it++){
            if(*it==v1)*it=v2;
            else if(*it==v2)*it=v1;
        }
    }
}
void grafo::dfs(int x){
    pre[x]=npre++;
    for(int w:adj[x]){
        if(pre[w]==-1) dfs(w);
        if(idade[w]<menor) menor=idade[w];
    }
}

int main(){
 int k,r,a,b,c;//K=n vertice,r=n relacoes,c= n comandos
 cin>>k>>r>>c;
 grafo grafo(k+1);
 for(int i=1;i<k+1;i++){
     cin>>idade;
 }
 for(int i=0;i<r;i++){
     cin>>a>>b;
     grafo.adicionararesta(a,b);
 }
    while(c--){
        char cmd;
        cin>>cmd;
        if(cmd=='T'){
            cin>>a>>b;
            grafo.troca(a,b);
        }
        else{
            memset(pre,-1,sizeof(pre));
            npre=1;
            menor=101;
            cin>>a;
            grafo.dfs(a);
            if(menor!=101) cout<<menor;
            else cout<<"*";
        }
    }
    return 0;
}

link da questão:https://olimpiada.ic.unicamp.br/pratique/p2/2017/f1/chefe/

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Tlrc disse:

for(int i=1;i<k+1;i++){
     cin>>idade;
 }

Continua errado. Aqui a variável é escalar. Ela foi declarada na linha 5 como vetor.

Sem uma dica para o próprio programador do que cada variável ou comando está fazendo esse código vira um spagethi difícil de dizer onde é a ponta do fim e a ponta do começo.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu consertei mas ainda está dando o erro de fechar,logo após executar o void troca.Se não conseguir ajudar pode dizer,pois a leitura de um livro poderá ser mais eficiente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×