[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 » |