Você está na página 1de 2

#include <iostream>

#include <cstdlib>

using namespace std;

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) {}

Vertice *a, *b;


int custo;

Aresta &operator=(const Aresta &o) { a = o.a; b = o.b; custo =


o.custo; return *this;}
};
int compara_aresta(const void *_a, const void *_b)
{
const Aresta *a = (const Aresta *)_a;
const Aresta *b = (const Aresta *)_b;
return a->custo - b->custo;
}

Vertice:: Vertice() : num(0), pai_direto(0) {}


inline Vertice *Vertice:: pai()
{
if (pai_direto == 0) return this;
pai_direto = pai_direto->pai();
return pai_direto;
}
bool Vertice:: conectado(Vertice *v)
{
return (pai() == v->pai());
}
void Vertice:: conecta(Vertice *v)
{
if (pai_direto != 0) pai_direto->conecta(v->pai());
pai_direto = v->pai();
}
int main(int argc, char *argv[])
{

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

qsort((void *)&rotas[0], num_rotas, sizeof(Aresta),


&compara_aresta);

cout << "Teste " << teste << endl;

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

cout << endl;

teste ++;
}

Você também pode gostar