Cod sursa(job #2201522)

Utilizator Phineas09Phineas09 Phineas09 Data 5 mai 2018 01:24:47
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.97 kb
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define Max 111111111

typedef struct lista {
	int nodeName;
	int distance;
	lista* next;
} lista;

//int** citireMatrice(char* filename, int &colls)
//{
//	FILE* fin = fopen(filename, "r");
//	fscanf(fin, "%d", &colls);
//	int** matrice = (int**)malloc(sizeof(int*)*(colls + 1));
//	for (int i = 0; i < colls; i++)
//	{
//		matrice[i] = (int*)malloc(sizeof(int)*(colls + 1));
//		for (int j = 0; j < colls; j++)
//		{
//			fscanf(fin, "%d", &matrice[i][j]);
//		}
//	}
//	fclose(fin);
//	return matrice;
//}

int** citireMatrice(int &colls)
{
	FILE* fin = fopen("dijkstra.in", "r");
	int o = 0;
	fscanf(fin, "%d %d", &colls, &o);
	int** matrice = (int**)malloc(sizeof(int*)*(o + 1));

	for (int i = 0; i < o; i++) {
		matrice[i] = (int*)malloc(sizeof(int)*(o + 1));
		for (int j = 0; j < o; j++)
		{
			matrice[i][j] = Max;
			if (i == j)
				matrice[i][i] = 0;
		}
	}
	int a, b, c;
	for (int i = 0; i < o; i++)
	{
		fscanf(fin, "%d %d %d", &a, &b, &c);
		matrice[a - 1][b - 1] = c;
	}
	fclose(fin);
	return matrice;
}

void append(lista* &head, int val, int distance)
{
	if (!head)
	{
		head = (lista*)malloc(sizeof(lista));
		head->distance = distance;
		head->next = NULL;
		head->nodeName = val;
		return;
	}
	append(head->next, val, distance);
}

int getMinList(lista* &head, lista* &min)
{
	if (!head)
	{
		lista* found = min;
		min = min->next;
		int ret = found->nodeName;
		free(found);
		return ret;
	}
	if (head->distance < min->distance)
		return getMinList(head->next, head);
	else
		return getMinList(head->next, min);
}

void updateList(lista* head, int val, int newDist)
{
	if (head->nodeName == val) {
		head->distance = newDist;
		return;
	}
	updateList(head->next, val, newDist);
}

void Dijkstra(int** matrice, int node, int colls)
{
	lista* coada = NULL;
	int* vizitati = (int*)calloc(colls, sizeof(int));
	int* parinti = (int*)malloc(colls * sizeof(int));
	int* distante = (int*)malloc(colls * sizeof(int));

	for (int i = 0; i < colls; i++)
	{
		if (matrice[node][i] != Max)
			parinti[i] = node;
		distante[i] = matrice[node][i];
	}

	append(coada, node, 0);

	while (coada)
	{
		node = getMinList(coada, coada);
		vizitati[node] = 1;
		for (int i = 0; i < colls; i++)
		{
			if (matrice[node][i] != 0 && matrice[node][i] != Max && vizitati[i] == 0)
			{
				append(coada, i, distante[i]);
				if (distante[node] + matrice[node][i] < distante[i])
				{
					distante[i] = distante[node] + matrice[node][i];
					parinti[i] = node;
					updateList(coada, i, distante[i]);
				}
			}
		}
	}
	FILE* fout = fopen("dijkstra.out", "w");
	for (int i = 1; i < colls; i++)
		fprintf(fout, "%d ", distante[i]);
	printf("\n");
	fclose(fout);
}

int main()
{
	int** matrice = NULL;
	int colls;
	matrice = citireMatrice(colls);

	Dijkstra(matrice, 0, colls);
	return 0;
}