[C++] Algorytm Dijkstry
Ostatnio zmodyfikowano 2015-01-04 20:04
lukib Temat założony przez niniejszego użytkownika  | 
[C++] Algorytm Dijkstry » 2015-01-04 19:03:48 Cześć, jak chodzi o programowanie to jestem początkujący. Mam problem. Znalazłem na stronie:  / algorytm do znajdowania najkrótszej drogi w grafie. #include<iostream> #include<vector> #include<set>
  using namespace std;
  const int infty = 1000000000;  int n, m; vector < pair < int, int > > adj[ 100000 ];
  vector < int > waga;
  struct cmp {          bool operator ()( const int & a, const int & b )     {         if( waga[ a ] < waga[ b ] ) return true;                  if( waga[ a ] > waga[ b ] ) return false;                  return a < b;     } };
 
  set < int, cmp > kopiec; 
 
  void dijkstra( int s ) {     int v, u, c;     waga.clear();      waga.resize( n, infty );           waga[ s ] = 0;     kopiec.clear();     kopiec.insert( s );          while( !kopiec.empty() )     {         u = *( kopiec.begin() );         kopiec.erase( kopiec.begin() );                  for( int i = 0; i < adj[ u ].size(); i++ )         {             v = adj[ u ][ i ].first;             c = adj[ u ][ i ].second;             if( waga[ u ] + c < waga[ v ] )             {                                  kopiec.erase( kopiec.find( v ) );                 waga[ v ] = waga[ u ] + c;                 kopiec.insert( v );             }         }     }           }
  int main( void ) {     int a, b, c, s, t;          cin >> n >> m;     for( int i = 0; i < m; i++ )     {         cin >> a >> b >> c;          adj[ a ].push_back( pair < int, int >( b, c ) );     }          cin >> s >> t;           dijkstra( s );      cout << waga[ t ];     return 0; }
  Próbując najprostszego przykładu, czyli trójkąta o bokach 3, 4, 5. Wpisuję do programu: 3 3 (trzy wierzchołki i krawędzie) 1 2 3 (pierwszy i drugi wierzchołek połączony krawędzią o wadze 3) 1 3 4 (pierwszy i trzeci wierzchołek połączony krawędzią 4) 2 3 5 (drugi i trzeci wierzchołek połączony krawędzią o wadze 5) 1 2 (chcę znać najkrótszą drogę między wierzchołkiem 1, a wierzchołkiem 2) Program na wyjściu powinien wypisać: 3 A program nic nie wypisuje. Próbowałem też numerować wierzchołki od zera: 3 3 0 1 3 0 2 4 1 2 5 0 1 Niestety tutaj też nic nie wypisuje. Czy ten algorytm jest zły i trzeba coś w nim poprawić, czy ja coś źle rozumiem? Z góry dziękuję za odpowiedź!  | 
 | 
NopeDotAvi  | 
» 2015-01-04 20:04:15 Jeżeli nie jesteś w stanie samemu napisać dijkistry to zrób BFS, też znajdzie najkrótszą drogę.  | 
 | 
|  « 1 »  |