Pagini recente » Istoria paginii runda/ultima_rasuflare | Istoria paginii runda/oji200911/clasament | Istoria paginii runda/aasfa/clasament | Istoria paginii runda/rar12/clasament | Cod sursa (job #2436672)
#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;
}