Ir ao conteúdo
  • Cadastre-se

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


Tlrc

Posts recomendados

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;
}

Link para o comentário
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 ? 

 

 

Link para o comentário
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/

Link para o comentário
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.

 

Link para o comentário
Compartilhar em outros sites

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!