Mai intai trebuie sa te autentifici.
Cod sursa(job #2436672)
| Utilizator | Data | 6 iulie 2019 17:01:25 | |
|---|---|---|---|
| Problema | Algoritmul lui Dijkstra | Scor | 100 |
| Compilator | cpp-64 | Status | done |
| Runda | Arhiva educationala | Marime | 1.5 kb |
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
const int NMAX = 50010;
const int infinit=1<<31-1;
int D[NMAX];
int N,M;
bool inCoada[NMAX];
vector<pair<int,int>> GRAF[NMAX];
struct compara
{
bool operator()(int x,int y)
{
return D[x]>D[y];
}
};
priority_queue<int,vector<int>,compara> cue;
void citeste()
{
fin>>N>>M;
int s,f,x;
for(int i = 1;i<=M;i++)
{
fin>>s>>f>>x;
GRAF[s].push_back({f,x});
}
}
void dijkstra(int start)
{
for(int i = 1;i<=N;i++)
D[i]=infinit;
D[start]=0;
cue.push(start);
inCoada[start]=true;
while(cue.size())
{
int curr = cue.top();
cue.pop();
inCoada[curr]=false;
for(int i = 0;i<GRAF[curr].size();i++)
{
int vec = GRAF[curr][i].first;
int cost = GRAF[curr][i].second;
if(D[curr]+cost<D[vec])
{
D[vec]=D[curr]+cost;
if(inCoada[vec]==false)
{
cue.push(vec);
inCoada[vec]=true;
}
}
}
}
}
void afis()
{
for(int i = 2;i<=N;i++)
{
if(D[i]!=infinit)
fout<<D[i]<<" ";
else
fout<<0<<" ";
}
}
int main()
{
citeste();
dijkstra(1);
afis();
return 0;
}
