Pagini recente » Cod sursa (job #1551900) | Cod sursa (job #2297575) | Cod sursa (job #621899) | Cod sursa (job #2207019) | Cod sursa (job #1651414)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <utility>
#include <bitset>
#define NMAX 50001
#define oo 2000000000
using namespace std;
vector < pair<long,long> >G[NMAX];
int N,M;
void ReadData()
{
FILE *fin=fopen("dijkstra.in","r");
fscanf(fin,"%d %d",&N,&M);
for(int i=1;i<=M;++i){
int x,y,c;
fscanf(fin,"%d %d %d",&x,&y,&c);
G[x].push_back(make_pair(y,c));
}
fclose(fin);
}
long D[NMAX];
class MinHeap
{
public:
bool operator()(long a,long b)
{
return D[a]>D[b];
}
};
priority_queue<long,vector<long>,MinHeap>H;
bitset<NMAX>viz;
void Dijkstra(int start)
{
for(int i=1;i<=N;++i)D[i]=oo;
vector < pair<long,long> >::iterator it;
for(it=G[start].begin();it!=G[start].end();++it)
{D[it->first]=it->second;
H.push(it->first);
}
viz[1]=1;
while(!H.empty()){
while(!H.empty()&&viz[H.top()])H.pop();
if(H.empty())break;
start=H.top();
viz[start]=1;
H.pop();
for(it=G[start].begin();it!=G[start].end();++it)
if(!viz[it->first]&&D[it->first]>it->second+D[start]){
D[it->first]=it->second+D[start];
H.push(it->first);
}
}
FILE *fout=fopen("dijkstra.out","w");
for(int i=2;i<=N;++i)
if(D[i]==oo)fprintf(fout,"0 ");
else fprintf(fout,"%d ",D[i]);
}
int main()
{
ReadData();
Dijkstra(1);
return 0;
}