Witam, jest to mój pierwszy post więc proszę o wyrozumiałość :). Mam następujący problem podejrzewam że banalny ale nie wiem jak go rozwiązać :(. Mam program który wyznacza minimalne drzewo rozpinające przy pomocy algorytmu Kruskala. Program jest tak skonstruowany że najpierw podajemy liczbę wierzchołków potem liczbę krawędzi a w następnej kolejności łączymy wierzchołki i wpisujemy wagę krawędzi pomiędzy nimi i tu właśnie zaczyna się mój problem. A polega on na tym, że nie wiem jak zrobić aby ta waga była przypisywana automatycznie o wartości 1 lub 0. Z góry dzięki za wszelką pomoc.
#include <iostream>
#include <conio.h>
#include <queue>
using namespace std;
class Krawedz
{
public:
int pocz, koniec, waga;
};
class Porzadkuj
{
public:
bool operator()( Krawedz* const a, Krawedz* const b)
{
if(a->waga>b->waga)
return true;
return false;
}
};
int main()
{
int a,b,c,n,m;
cout<<"Podaj liczbe wierzcholkow: "; cin>>n;
cout<<"Podaj liczbe krawedzi: "; cin>>m;
cout<<"Podaj dane krawedzi w kolejnosci: wierzcholek pierwszy, drugi, waga"<<endl;
Krawedz* wskaznik;
priority_queue<Krawedz*,vector<Krawedz*>,Porzadkuj> kolejka, wynik;
for(int i=0;i<m;i++)
{
wskaznik=new Krawedz;
cin>>a>>b>>c;
wskaznik->pocz=a;
wskaznik->koniec=b;
wskaznik->waga=c;
kolejka.push(wskaznik);
}
int* korzen=new int[n+1];
int* nastepny=new int[n+1];
int* dlugosc=new int[n+1];
for(int i=1;i<n+1;i++)
{
korzen[i]=nastepny[i]=i;
dlugosc[i]=1;
}
int razem=0;
for(int i=0;i<m;i++)
{
wskaznik=kolejka.top(); .
kolejka.pop();
if(korzen[wskaznik->pocz]!=korzen[wskaznik->koniec])
{
int pomoc;
if(dlugosc[korzen[wskaznik->pocz]]>=dlugosc[korzen[wskaznik->koniec]])
{
pomoc=wskaznik->pocz;
wskaznik->pocz=wskaznik->koniec;
wskaznik->koniec=pomoc;
}
int rt=korzen[wskaznik->pocz];
dlugosc[korzen[wskaznik->koniec]]+=dlugosc[rt];
korzen[rt]=korzen[wskaznik->koniec];
for(int j=nastepny[rt];j!=rt;j=nastepny[j])
korzen[j]=korzen[wskaznik->koniec];
pomoc=nastepny[rt];
nastepny[rt]=nastepny[korzen[wskaznik->koniec]];
nastepny[korzen[wskaznik->koniec]]=pomoc;
wynik.push(wskaznik);
razem+=wskaznik->waga;
}
}
cout<<"Do minimalnego drzewa rozpinajacego grafu naleza krawedzie:"<<endl;
for(;!wynik.empty();)
{
wskaznik=wynik.top();
wynik.pop();
cout<<wskaznik->pocz<<" "<<wskaznik->koniec<<endl;
}
cout<<"Dlugosc wszystkich krawedzi w minimalnym drzewie rozpinajacym wynosi: "<<razem;
getch();
return 0;
}
Próbowałem gdzieś wrzucić taką komendę:
srand(time(NULL));
waga = rand()%2
cin.get()
ale niestety nie przynosiło to żadnych rezultatów tylko program się krzaczył. :(