Mai intai trebuie sa te autentifici.
Cod sursa(job #1913363)
Utilizator | 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': ' ' );
}