Mai intai trebuie sa te autentifici.

Cod sursa(job #1913363)

Utilizator Account451Gigel Gogu Account451 Data 8 martie 2017 12:42:02
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include <queue>
#include <cstdio>
using namespace std;
const int INF = 2000000000;
typedef pair <int, int> PII; //PAIR INT INT

int main()
{
    //citim ceva de genul
    /*
        N numarul de noduri, s nodul de plecare si t nodul final
        urmeaza N linii care vor reprezenta muchiile care pleaca din nodul respectiv
        pe fiecare linie va fi M numarul de muchii care pleaca din nodul urmat de nodul catre
        care pleaca si costul
    */
    int N,s,t;
    scanf("%d%d%d", &N, &s, &t);
    //lista de adiacenta
    vector<vector<PII> > edges(N);
    for(int i=0; i < N; i++)
    {
        int M;
        scanf("%d", &M);
        for(int j = 0;j < M; j++)
        {
            int vertex, dist;
            scanf("%d%d", &vertex, &dist);
            //adaugam in lista de adiacenta a lui i costul si nodul catre pelaca muchia
            //punem in a doua vertex deoarece sortarea in priority queue se face dupa primul param
            edges[i].push_back(make_pair(dist, vertex));
        }
    }

    //un priority queue care are lemente de tip PII, le tine intrun vector de PII si are ca
    //relatie de ordine functia data de greater<PII>
    priority_queue<PII, vector<PII>, greater<PII> > Q;
    //initializam vectorul de distante cu inf, iar vectorul de tati cu -1;
    vector<int> dist(N, INF), dad(N, -1);
    Q.push(make_pair(0,s));//punem in priority queue nodul de plecare
    dist[s] = 0;    //distanta pana la sursa e zero
    while(!Q.empty()){
        PII p = Q.top();Q.pop();//extragem primul element din priority_queue
        int here = p.second;
        if(here == t) break;

        //daca venim de pe o muchie care nu e de cost minim ( deja dist[here] = drumul minim )
        if(dist[here] != p.first) continue;

        for(vector<PII>::iterator it = edges[here].begin(); it!= edges[here].end(); it++){
            if(dist[here] + it->first < dist[it->second]){
                dist[it->second] = dist[here] + it->first;
                dad[it->second] = here;
                Q.push(make_pair(dist[it->second], it->second));
            }
        }
    }

    printf("%d\n", dist[t]);
	if (dist[t] < INF)
    	for (int i = t; i != -1; i = dad[i])
            printf("%d%c",i, (i == s) ? '\n': ' ' );

}