Pagini recente » Cod sursa (job #1142438) | Cod sursa (job #2588666) | Cod sursa (job #1747913) | Cod sursa (job #1117236) | Cod sursa (job #1651386)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <utility>
#include <bitset>
#define NMAX 25001
#define oo 250000*1001
using namespace std;
vector < pair<int,int> >G[NMAX];
int N,M;
void ReadData()
{
FILE *fin=fopen("dijkstra.in","r");
fscanf(fin,"%d %d",&N,&M);
for(int i=1;i<=N;++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()(int a,int b)
{
return D[a]>D[b];
}
};
priority_queue<int,vector<int>,MinHeap>H;
bitset<NMAX>viz;
void Dijkstra(int start)
{
for(int i=2;i<=N;++i)D[i]=oo;
viz[start]=true;
vector< pair<int,int> >::iterator it;
for(it=G[start].begin();it!=G[start].end();++it){
D[it->first]=it->second;
H.push(it->first);
}
while(!H.empty()){
while(!H.empty()&&viz[H.top()])H.pop();
if(H.empty())break;
start=H.top();
H.pop();
viz[start]=true;
for(it=G[start].begin();it!=G[start].end();++it)
if( !viz[it->first] && ( D[start]+it->second < D[it->first] ) )
{
D[it->first]=it->second+D[start];
H.push(it->first);
}
}
FILE *fout=fopen("dijkstra.out","w");
for(int i=2;i<=N;++i)
D[i]==oo ? fprintf(fout,"0") : fprintf(fout,"%d ",D[i]);
fclose(fout);
}
int main()
{
ReadData();
Dijkstra(1);
return 0;
}