Cod sursa(job #2019325)

Utilizator bcrisBianca Cristina bcris Data 7 septembrie 2017 15:08:55
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <stdio.h>
#include <vector>

using namespace std;

#define NMAX 10
#define INF 1 << 30 

int n, m;
int visited[NMAX], distances[NMAX], parent[NMAX];
vector<pair<int, int> > lista[NMAX];

using namespace std;


void read() {
	scanf("%d %d\n", &n, &m);
	int a, b, c;
	for (int i = 0 ; i < m; i++) {
		scanf("%d %d %d\n", &a, &b, &c);
		lista[a].push_back(std::make_pair(b, c));
		lista[b].push_back(std::make_pair(a, c));
	}
}

void dijkstra(int begin_node) {
	visited[begin_node] = 1;
	for (int i = 1; i <= n; i++) {
		distances[i] = INF;
		parent[i] = begin_node;
	} 

	for (vector<pair<int, int> >::iterator it = lista[begin_node].begin(); it != lista[begin_node].end(); ++it) {
		distances[(*it).first] = (*it).second;
	}

	int nodes_visited = 1;

	while (nodes_visited < n) {
		int min_distance = INF;
		int next_node = 0;
		for (int i = 1; i <= n; i++) {
			if (visited[i] == 0 && distances[i] < min_distance) {
				min_distance = distances[i];
				next_node = i;
			}
		}

		if (next_node == 0) {
			return;
		}
		visited[next_node] = 1;
		nodes_visited++;
		
		for (vector<pair<int, int> >::iterator it = lista[next_node].begin(); it != lista[next_node].end(); ++it) {
			int neighbour = (*it).first;
			int cost = (*it).second;
			if (!visited[neighbour]) {
				if (distances[next_node] + cost < distances[neighbour]) {
					distances[neighbour] = distances[next_node] + cost;
					parent[neighbour] = next_node;
				}
			}
		}	
	}		
}

int main() {

	freopen("dijkstra.in", "r", stdin);
	freopen("dijkstra.out", "w", stdout);
	

	read();

	dijkstra(1);

	for (int i = 2; i <= n; i++) {
		printf("%d ", distances[i]);
	}

	return 0;
}