Kezdőoldal » Számítástechnika » Programozás » Dijkstra - irányítatlanban is...

Dijkstra - irányítatlanban is működjön?

Figyelt kérdés

A c++-ban megírt Dijkstra algoritmusomat kéne javítani úgy, hogy irányítatlan gráfokban is működjön. Tudna valaki segíteni? A kód:


#include <iostream>

#include <fstream>

#include <vector>

#include <sstream>



//#include <queue>

using namespace std;



struct El { // 1 db. élnek a konstrukciója


private:

int kezdo;

int veg;

int koltseg;


public:

El(){ kezdo=0; veg=0; koltseg=0; } // Nem adtunk meg parametereket az él létrehozásakor

El(int k,int u,int s) // Megadtunk paramétereket -||-

{

kezdo=k;

veg=u;

koltseg=s;

}



int ReturnKezdo() //Az él kezdõcsúcsát adja vissza

{

return kezdo;

}


int ReturnVeg() //Az él végcsúcsát adja vissza

{

return veg;

}


int ReturnKoltseg() //Az él költségét adja vissza

{

return koltseg;

};

void SetParameters(int kezd,int vegz, int kolts) // Beallíthatja egy él kezdõ/vég - csúcsát , valamint költségét

{

kezdo=kezd;

veg=vegz;

koltseg=kolts;

}


};

struct Csucs { // 1. db csúcsnak a konstrukciója



private:

int csucsNumber;

int currentKoltseg;



public:

Csucs(){ csucsNumber=0; currentKoltseg=0; }

Csucs(int k,int s)

{

csucsNumber=k;

currentKoltseg=s;

}



int ReturnCsucsNumber()

{

return csucsNumber;

}



int ReturnCurrentKoltseg()

{

return currentKoltseg;

};

void SetParameters(int kezd, int kolts)

{

csucsNumber=kezd;

currentKoltseg=kolts;

}


};



struct PriorityQueue

{

Csucs pSor[100]; //max 100 csúcsból álló prioritásos sor

int elemszam;


//Konstruktorok:


PriorityQueue(){ elemszam=0; } // kezdetben 0 elembõl áll a Prio. Sor


//PriorityQueue()

int Beszur(int k,int ko) // Beszúrunk 1 elemet

{

int x=Elemee(k);

if(elemszam==0) //ha még üres a sor, akkor csak szúrunk

{

pSor[0].SetParameters(k,ko);

elemszam++;

}else if(x==-1)

{

for(int i=0;i<elemszam;i++)

{

if(pSor[i].ReturnCurrentKoltseg()>ko)

{

Helyetcsinal(i);

pSor[i].SetParameters(k,ko);

elemszam++;

}

}

}else if(x!=-1)

{

for(int j=elemszam;j>=x;j--)

{

pSor[j+1]=pSor[j]; //CopyConstruktor


}

pSor[x].SetParameters(k,ko);

}


};

int Elemee(int csucs) //Eleme-e e egy csúcs a sornak

{

for(int i=0;i<elemszam;i++)

if(pSor[i].ReturnCsucsNumber()==csucs)

return i;


return -1;

}

Csucs Elvesz() // kiveszünk 1 elemet a sorból

{

Csucs elso=pSor[0];

for(int i=0;i<elemszam-1;i++)

{

pSor[i].SetParameters(pSor[i+1].ReturnCsucsNumber(),pSor[i+1].ReturnCurrentKoltseg());

}

elemszam--;

return elso;

}

Csucs First() // lekérdezzük a legnagyobb prioritású elemet

{

return(pSor[0]);

}

void Helyetcsinal(int hely) // ha be kell szúrnunk 1 elemet kettõ közzé akkor helyet csinalunk neki (az utána lévõket hátrább csúsztatjuk)

{

for(int i=elemszam;i>=hely;i--)

{

pSor[i+1].SetParameters(pSor[i].ReturnCsucsNumber(),pSor[i].ReturnCurrentKoltseg());

}

}

bool Ures() // üres-e a sor

{

if(elemszam>0) return false;

else return true;

}


};



int main()

{

int csucsszam ; // csucsok szama

int elszam=-2; //elek szama


El _elek[1000]; //elek vektora


int b,c,d; //temp valtozok


PriorityQueue pQ; // prioritasos sor



int Keszi=-1; //Keszen levo csucsokra vonatkozo léptetõ


//beolvassuk az adatokat

fstream myfile("Dijkstra.txt");


if(myfile.is_open() )

{

while(!myfile.eof())

{

elszam++;

if(elszam==-1)

myfile>>csucsszam;

else

{

myfile>>b;

myfile>>c;

myfile>>d;

}

_elek[elszam].SetParameters(b,c,d);

}

}

myfile.close();

if(elszam<=0)

{

cout<<"Nincs el megadva!";

return 1;

}

if(csucsszam<=0)

{

cout<<"Nincs csucs megadva!";

return 2;

}

int Parent[csucsszam]; //Parent vektor

int Distance[csucsszam]; // Tavolsag vektor

int Kesz[csucsszam]; // Tavolsag azon csucsokhoz, ahova mar tudjuk a vegleges MIN tavolsagot



for(int i=0;i<csucsszam;i++)

{


Parent[i]=-1;

Distance[i]=0;

Kesz[i]=-1;

}


pQ.Beszur(1,0);


while(!pQ.Ures())

{



Csucs aktualis=pQ.Elvesz(); // a legkisebb prioritasu


Keszi++;

Kesz[Keszi]=aktualis.ReturnCsucsNumber(); //beirunk meg 1 elemet a keszek halmazaban, NOVELJUK A KESZi-t

for(int i=0;i<=elszam;i++) //keresunk az osszes el kozott

{


if(_elek[i].ReturnKezdo()==aktualis.ReturnCsucsNumber()) //megnezzuk az osszes csucsbol kimeno eleket

{

bool joLesz=true; // szerepel-e mar a vegzett csucsok kozott ?

for(int j=0;j<Keszi;j++) // megnezzuk, hogy nem-e szerepel mar a keszek kozott a mostani csucs

{

if(_elek[i].ReturnVeg()==Kesz[j]) //ha mar szerepel a nezett csucsok kozott akkor nem nezzuk

joLesz=false;

}

if(joLesz==true) // ha viszont nem szerepel

{

if(Distance[_elek[i].ReturnVeg()]>Distance[aktualis.ReturnCsucsNumber()]+_elek[i].ReturnKoltseg());

{


Distance[_elek[i].ReturnVeg()]=Distance[aktualis.ReturnCsucsNumber()]+_elek[i].ReturnKoltseg();

pQ.Beszur(_elek[i].ReturnVeg(),Distance[_elek[i].ReturnVeg()]);

Parent[_elek[i].ReturnVeg()]=_elek[i].ReturnKezdo();

}


}


}

}



}


cout<<Distance[csucsszam]<<endl;

int j=csucsszam;


std::ostringstream oss;


oss<<j;

while(j!=-1)

{


oss<<","<<Parent[j];

j=Parent[j];

}

string kiir;

kiir+=oss.str();

for(int i=kiir.size()-4;i>=0;i--)

{

cout<<kiir[i];

}


return 0;

}



2012. dec. 11. 13:57
 1/4 anonim ***** válasza:
nem
2012. dec. 11. 14:10
Hasznos számodra ez a válasz?
 2/4 anonim ***** válasza:
2012. dec. 11. 14:18
Hasznos számodra ez a válasz?
 3/4 iostream ***** válasza:

1. Ekkora nagy kódot valami formázott formában, pl pastebinen csessz ide.

2. Minek írsz saját prioritásos sort, amikor van std is?

3. A Dijsktrával semmi baj, a reprezentációdat kell megváltoztatni.

2012. dec. 11. 16:23
Hasznos számodra ez a válasz?
 4/4 A kérdező kommentje:

else

{

myfile>>b;

myfile>>c;

myfile>>d;

}

_elek[elszam].SetParameters(b,c,d);

}

}

myfile.close();



Ha itt eltárolnám nem csak a b,c élt, hanem a c,b élt is, akkor az irányítatlan gráf tekinthető lenne irányítottnak. EZt hogy tudom kivitelezni?

2012. dec. 12. 14:21

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!