Dodanie do programu, losowanie liczby

0

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ł. :(

0

srand(time(NULL)); // tylko jeden raz na początku programu.
waga=rand()%2; // zapomniałeś średnik
//trzeci wiersz absolutnie zbędny.

Z twojego postu jednoznacznie wynika że nie tylko nie rozumiesz niczego w tym kodzie co podałeś, zaś nie znasz nawet elementarnych podstaw.
Założę się że ta jednoznaczność jest nie tylko w moim pojmowaniu.

0

Fakt zapomniałem napisać średnika, a możesz mi pomóc i powiedzieć gdzie mógłbym to wstawić aby waga przybierała wartości o-1 ?

0

W kodzie masz klasę z przeładowanym operatorem nawet. Z taką wiedzą powinieneś znać odpowiedź na własne pytanie :P
Chodzi Ci o losowanie między 0 a 1?

0

Tak, no ale właśnie zbyt biegły w C++ jeszcze tak za bardzo to nie jestem :/

0

I ogólnie w programowaniu :P
srand możesz dać jako pierwszą linijkę programu.
rand() zamiast tego co wpisuje użytkownik:

wskaznik->waga=c;
0

Niestety to nie pomaga dalej trzeba wpisywać wagę tej krawędzi :/

0

Przerobiłem ten program w taki sposób ale dalej chce żeby podawać tą wagę.

 


#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)
	{
    srand (time(0));
    waga = rand()%2; 
    { 
		if()

        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"<<endl;
    Krawedz* wskaznik; 
    priority_queue<Krawedz*,vector<Krawedz*>,Porzadkuj> kolejka, wynik;    
    for(int i=0;i<m;i++)        
    { 
        wskaznik=new Krawedz; 
        cin>>a>>b; 

		srand (time(0));
        c = rand()%2; 

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

 
0

srand() nie może być w pętli for! Umieść gdzieś powyżej
W jaki sposób pyta o wagę? c nie ma już w cin, a z tekstu też usunąłeś.
Nauka programowania, to jak nauka matematyki. Trzeba się uczyć od podstaw i starać się zrozumieć. Jeżeli chcesz tylko zdać, to zapłać komuś, niech Ci zrobi, albo odpuść sobie takie studia.

0

Już wszystko działa :) Poniżej wrzucam działający program jak by komuś może się kiedyś przydał :) Dzięki wielkie za pomoc Sarrus :)

#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; 
        srand (time(0));
        c = rand()%2; 
        
        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;    
}            
 
 
0

A kto powiedział że ja studiuje ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1