#include <iostream>
#include <list>
#include <queue>
#include <vector>
#include <utility> //biblioteka potrzebna do tworzenia par
using namespace std;
struct vertex
{
int kolor;
int odleglosc;
int rodzic;
};
typedef struct pair < int, int > para;
int main()
{
cout << "Ile wierzcholkow w grafie? ";
int rozmiar;
cin >> rozmiar;
vertex wierzcholek[ rozmiar + 1 ];
list < para > graph[ rozmiar + 1 ];
queue < int > kolejka;
cout << "Ile krawędzi: ";
int m;
cin >> m;
//przypisywanie polaczen
for( int i = 1; i <= m; i++ )
{
int v1, v2, weight;
cin >> v1 >> v2 >> weight;
para pair1 = make_pair( v2, weight );
graph[ v1 ].push_back( pair1 );
}
//wyswietlanie sasiadow
/*
for(int i = 1; i <= rozmiar; i++)
{
cout << i << ": ";
// ta petla odpowiada za wyswietlanie wierzcholkow docelowych
// ta petla moze dzialac jako wizualizacja list sasiedztwa
for(list<para>::iterator j = graph[i].begin(); j != graph[i].end(); j++)
{
cout << j -> first << "#" << j -> second << " ";
}
// ta petla odpowiada za wyswietlanie wierzcholkow wyjsciowych
// ta petla powinna dzialac osobno (bez pierwszej petli for) dla grafu nieskierowanego
int act, example;
act = i;
for(int w=act; w>=1; w--)
{
for(list<para>::iterator j = graph[w].begin(); j != graph[w].end(); j++)
{
if(j->first == i)
cout << w << " ";
}
}
cout << endl;
}
*/
//PRZESZUKIWANIE WSZERZ
cout << endl << "Podaj zrodlowy wierzcholek: ";
int root;
cin >> root;
for( int i = 1; i <= rozmiar; i++ )
{
wierzcholek[ i ].kolor = 0; //0 = bialy
wierzcholek[ i ].odleglosc = 0;
wierzcholek[ i ].rodzic = 0;
}
wierzcholek[ root ].kolor = 1; //1 = szary
wierzcholek[ root ].odleglosc = 0;
wierzcholek[ root ].rodzic = 0;
kolejka.push( root );
int obecny;
while( kolejka.empty() == false )
{
obecny = kolejka.front();
kolejka.pop();
//for(int k=1; k<=graph[obecny].size(); k++)
//{
for( list < para >::iterator j = graph[ obecny ].begin(); j != graph[ obecny ].end(); j++ )
{
if( wierzcholek[ j->first ].kolor == 0 )
{
wierzcholek[ j->first ].kolor = 1;
wierzcholek[ j->first ].odleglosc = wierzcholek[ obecny ].odleglosc + 1;
wierzcholek[ j->first ].rodzic = obecny;
kolejka.push( j->first );
}
wierzcholek[ obecny ].kolor = 2; //2 = czarny
}
//}
}
cout << endl << endl;
for( int i = 1; i <= rozmiar; i++ )
cout << i << ": " << wierzcholek[ i ].odleglosc << endl;
return 0;
}
Wkleiłem cały kod ponieważ uważam, że aby zrozumieć co mam na myśli należy zerknąć na kod całego programu.
Mój problem dotyczy sekcji "przeszukiwanie wszerz" a dokładniej pętli ze zmienną j. Pętla zachowuje się tak jakby odwoływała się do licznika pary w której mamy dwa elementy, co jest oczywiście błędem.
Taki sam problem miałem w sekcji wyświetlanie sąsiadów. W rozwiązaniu problemu pomogły pętle poprzedzające pętle z iteratorem. W taki sam sposób chciałem rozwiązać problem w "przeszukiwaniu" (stosując pętlę ze zmienną k) lecz nic to nie dało.
Wracając do problemu. Chcę aby pętla z iteratorem j (w sekcji przeszukiwanie wszerz) liczyła ilość elementów listy, bo w tym momencie liczy ilość elementów w pair.
Proszę powiedzieć co robię źle i w jaki sposób można by rozwiązać ten problem.
Mam nadzieję, że wszystko jasno opisałem.
Pozdrawiam i czekam na odpowiedź.
Przepraszam za copypast z cpp0x, ale tam niestety nikt nie potrafił mi pomóc
