Pagini recente » Cod sursa (job #376752) | Cod sursa (job #1016664) | Cod sursa (job #2191180) | Cod sursa (job #1074741) | Cod sursa (job #2695263)
#include <iostream>
#include <vector>
#include <fstream>
#define INT_MAX 10000000
using namespace std;
ifstream f("in.txt");
void DijkstrasTest();
class Node;
class Edge;
void Dijkstras();
vector<Node*>* AdjacentRemainingNodes(Node* node);
Node* ExtractSmallest(vector<Node*>& nodes);
int Distance(Node* node1, Node* node2);
bool Contains(vector<Node*>& nodes, Node* node);
void PrintShortestRouteTo(Node* destination);
vector<Node*> nodes;
vector<Edge*> edges;
class Node {
public:
Node(int id)
: id(id), previous(NULL), distanceFromStart(INT_MAX) {
nodes.push_back(this);
}
public:
int id;
Node* previous;
int distanceFromStart;
};
class Edge {
public:
Edge(Node* node1, Node* node2, int distance)
: node1(node1), node2(node2), distance(distance) {
edges.push_back(this);
}
bool Connects(Node* node1, Node* node2) {
return (
(node1 == this->node1 &&
node2 == this->node2) ||
(node1 == this->node2 &&
node2 == this->node1));
}
public:
Node* node1;
Node* node2;
int distance;
};
void Dijkstras() {
while (nodes.size() > 0) {
Node* smallest = ExtractSmallest(nodes);
vector<Node*>* adjacentNodes =
AdjacentRemainingNodes(smallest);
const int size = adjacentNodes->size();
for (int i = 0; i < size; ++i) {
Node* adjacent = adjacentNodes->at(i);
int distance = Distance(smallest, adjacent) +
smallest->distanceFromStart;
if (distance < adjacent->distanceFromStart) {
adjacent->distanceFromStart = distance;
adjacent->previous = smallest;
}
}
delete adjacentNodes;
}
}
// gasim nodul la distanta cea mai mica
Node* ExtractSmallest(vector<Node*>& nodes) {
int size = nodes.size();
if (size == 0) return NULL;
int smallestPosition = 0;
Node* smallest = nodes.at(0);
for (int i = 1; i < size; ++i) {
Node* current = nodes.at(i);
if (current->distanceFromStart <
smallest->distanceFromStart) {
smallest = current;
smallestPosition = i;
}
}
nodes.erase(nodes.begin() + smallestPosition);
return smallest;
}
// return vecinii lui node care inca sunt in colectia de noduri
vector<Node*>* AdjacentRemainingNodes(Node* node) {
vector<Node*>* adjacentNodes = new vector<Node*>();
const int size = edges.size();
for (int i = 0; i < size; ++i) {
Edge* edge = edges.at(i);
Node* adjacent = NULL;
if (edge->node1 == node) {
adjacent = edge->node2;
} else if (edge->node2 == node) {
adjacent = edge->node1;
}
if (adjacent && Contains(nodes, adjacent)) {
adjacentNodes->push_back(adjacent);
}
}
return adjacentNodes;
}
//distanta dintre 2 noduri conectate
int Distance(Node* node1, Node* node2) {
const int size = edges.size();
for (int i = 0; i < size; ++i) {
Edge* edge = edges.at(i);
if (edge->Connects(node1, node2)) {
return edge->distance;
}
}
return -1;
}
// verific daca vectorul de noduri il are pe node
bool Contains(vector<Node*>& nodes, Node* node) {
const int size = nodes.size();
for (int i = 0; i < size; ++i) {
if (node == nodes.at(i)) {
return true;
}
}
return false;
}
//afis
void PrintShortestRouteTo(Node* destination) {
Node* previous = destination;
while (previous) {
cout << previous->id << " ";
previous = previous->previous;
}
cout << endl;
}
//distanta return
int returndistance(Node* destination)
{
return destination->distanceFromStart;
}
int main()
{
int n,m,z,y,c;
Node* vect[1001]; //declaram vectoru de 10
Edge* edg[1001]; //declaram vectoru de muchii de 10
cin>>n>>m;
for(int i=1;i<=n;i++)
vect[i]= new Node(i);
for(int i=1;i<=m;i++)
{
cin>>z>>y>>c;
edg[i]= new Edge(vect[z],vect[y],c);
}
vect[1]->distanceFromStart = 0; //nodu de inceput e mereu s
Dijkstras();
for(int i=2;i<=n;i++)
cout<<returndistance(vect[i])<<" ";
}