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

[C++] Algorytm Dijkstry

Ostatnio zmodyfikowano 2015-01-04 20:04
Autor Wiadomość
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.
C/C++
#include<iostream>
#include<vector>
#include<set>

using namespace std;

const int infty = 1000000000; // uwaga na limit
int n, m;
vector < pair < int, int > > adj[ 100000 ];

vector < int > waga;

struct cmp
{
    // czy a jest mniejsze od b
    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(); // kasuje wektor
    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 ] )
            {
                // uaktualniamy wagę wierzchołka 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; // c = koszt krawędzi od a do b
        adj[ a ].push_back( pair < int, int >( b, c ) );
    }
   
    cin >> s >> t; // s - źródło, t - wierzchołek, do którego najkrótszej odległości szukamy
   
    dijkstra( s ); // alg. Dijkstry wypełni całą tablicę waga[..] najkrótszymi odległościami
    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ź!
P-124118
NopeDotAvi
» 2015-01-04 20:04:15
Znalazłem na stronie
Jeżeli nie jesteś w stanie samemu napisać dijkistry to zrób BFS, też znajdzie najkrótszą drogę.
P-124129
« 1 »
  Strona 1 z 1