Pagini recente » Cod sursa (job #781004) | Cod sursa (job #1912353) | Cod sursa (job #1834742) | Cod sursa (job #844040) | Cod sursa (job #533891)
Cod sursa(job #533891)
// http://infoarena.ro/problema/dijkstra
#include <cstdio>
#include <algorithm>
#include <list>
#include <queue>
using namespace std;
#define INFINITY 0x3f3f3f3f
#define maxSize 50001
#define location second
#define cost first
int nodes;
vector<int> dist; // se justifica folisirea vector prin prisma utilizarii assign si replace_if
list< pair<int,int> > graph[maxSize];
priority_queue< pair<int,int>, vector< pair<int,int> >, greater< pair<int,int> > > myHeap;
void read();
void dijkstra(int startNode);
bool isInf(int number) { return (number == INFINITY); };
void write();
int main() {
read();
dijkstra(1);
write();
return (0);
}
void read() {
FILE *in = fopen("dijkstra.in","rt");
int edges,from,to,cost;
fscanf(in,"%d",&nodes);
fscanf(in,"%d",&edges);
dist.resize(nodes+1);
for(int i=1;i<=edges;i++) {
fscanf(in,"%d",&from);
fscanf(in,"%d",&to);
fscanf(in,"%d",&cost);
graph[from].push_back(make_pair(cost,to)); // graful este orientat
}
fclose(in);
}
void dijkstra(int startNode) {
dist.assign(nodes+1,INFINITY);
dist[startNode] = 0;
pair<int,int> currentNode;
list< pair<int,int> >::iterator neighbour;
myHeap.push(make_pair(0,startNode)); // se introduce nodul de pornire in heap
while(!myHeap.empty()) {
currentNode = myHeap.top(); // se extrage minimul
myHeap.pop(); // se elimina nodul extras
for(neighbour=graph[currentNode.location].begin();neighbour!=graph[currentNode.location].end();neighbour++)
// daca se poate imbunatatii costul
if(dist[neighbour->location] > dist[currentNode.location] + neighbour->cost) {
dist[neighbour->location] = dist[currentNode.location] + neighbour->cost; // se imbunatateste
myHeap.push(make_pair(dist[neighbour->location],neighbour->location)); // se introduce in heap
}
}
}
void write() {
FILE *out = fopen("dijkstra.out","wt");
replace_if(dist.begin(),dist.end(),isInf,0);
for(int i=2;i<=nodes;i++)
fprintf(out,"%d ",dist[i]);
fclose(out);
}