Pagini recente » Cod sursa (job #317613) | Cod sursa (job #1786827) | Cod sursa (job #3336983) | Cod sursa (job #243522) | Cod sursa (job #495485)
Cod sursa(job #495485)
#include <fstream>
#include <vector>
#include <list>
using namespace std;
const int INFINITY = 1001;
int nodes,edges;
vector< list< pair<int,int> > > graph;
vector<int> father;
vector<int> dist;
vector<bool> visited;
void read();
void manageMemory();
void dijkstra(int startNode);
void write();
int main() {
read();
for(int i=1;i<=nodes;i++)
if(!visited.at(i))
dijkstra(i);
write();
return (0);
}
void read() {
ifstream in("dijkstra.in");
int from,to,cost;
in >> nodes >> edges;
manageMemory();
for(int i=1;i<=edges;i++) {
in >> from >> to >> cost;
graph.at(from).push_back(make_pair(to,cost));
}
in.close();
}
void manageMemory() {
graph.resize(nodes+1);
father.resize(nodes+1);
dist.resize(nodes+1);
visited.resize(nodes+1);
dist.assign(dist.size(),INFINITY);
dist.at(1) = NULL;
}
void dijkstra(int startNode) {
int toVisit = startNode;
int count = NULL;
pair<int,int> toVisitNext;
while(count != nodes) {
for(list< pair<int,int> >::iterator it=graph.at(toVisit).begin();it!=graph.at(toVisit).end();it++) {
toVisitNext = make_pair(NULL,INFINITY);
if(dist.at(toVisit) + it->second < dist.at(it->first))
dist.at(it->first) = dist.at(toVisit) + it->second;
if(it->second < toVisitNext.second)
toVisitNext = make_pair(it->first,it->second);
}
if(!toVisitNext.first)
break;
else {
toVisit = toVisitNext.first;
count++;
}
}
}
void write() {
ofstream out("dijkstra.out");
for(int i=2;i<=nodes;i++)
out << dist.at(i) << " ";
out.close();
}