Escolar Documentos
Profissional Documentos
Cultura Documentos
Exercicio 5
Exercicio 5
#include <cstdlib>
aos
class Vertice
{
public:
int num;
Vertice();
Vertice *pai();
bool conectado(Vertice *v);
void conecta(Vertice *v);
protected:
Vertice *pai_direto;
};
class Aresta
{
public:
Aresta(Vertice *_a, Vertice *_b, int _custo) :
a(_a), b(_b), custo(_custo) {}
Aresta() : a(0), b(0), custo(0) {}
int teste = 1;
while (true)
{
int num_tabas, num_rotas;
cin >> num_tabas;
if (num_tabas == 0) break;
cin >> num_rotas;
Vertice tabas[num_tabas];
for (int i = 0 ; i < num_tabas; i ++) tabas[i].num = i;
Aresta rotas[num_rotas];
for (int i = 0; i < num_rotas; i ++)
{
int x, y, z;
cin >> x >> y >> z;
if (x > num_tabas || y > num_tabas || x < 1 || y < 1)
{
cout << "rota " << i << " da entrada invlida" <<
endl;
exit(0);
}
if (y < x) { int tmp = x; x = y; y = tmp; }
rotas[i].a = &tabas[x-1];
rotas[i].b = &tabas[y-1];
rotas[i].custo = z;
}
int selecionadas = 0;
int idx_rotas = 0;
while (selecionadas < num_tabas-1 && idx_rotas < num_rotas)
{
const Aresta &rota = rotas[idx_rotas];
if ( !rota.a->conectado(rota.b) )
{
cout << rota.a->num+1 << " " << rota.b->num+1 << endl;
rota.a->conecta(rota.b);
selecionadas ++;
}
idx_rotas ++;
}
if (selecionadas != num_tabas-1)
{
cout << "*** grafo original no era conexo!?!?" << endl;
exit(0);
}
teste ++;
}