Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Błędnie działająca pętla for z iteratorem (pair)

Ostatnio zmodyfikowano 2015-04-07 20:57
Autor Wiadomość
Sztywny
Temat założony przez niniejszego użytkownika
Błędnie działająca pętla for z iteratorem (pair)
» 2015-04-03 22:25:15
Witam,
Zanim opiszę swój problem to wkleję kod źródłowy mojego programu:

C/C++
// troche hybryda XD

#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ź.
P-130038
Sztywny
Temat założony przez niniejszego użytkownika
» 2015-04-07 20:57:09
Odświeżam
P-130366
« 1 »
  Strona 1 z 1