Cod sursa(job #2892097)

Utilizator Razvan25Leanca Razvan Razvan25 Data 20 aprilie 2022 19:11:18
Problema Algoritmul lui Dijkstra Scor 20
Compilator c-64 Status done
Runda Arhiva educationala Marime 3.04 kb
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

#define inf 20001 

typedef struct graph {
	long** matrix;
	long numNodes;
	long numEdges;
}graph;

typedef struct list {
	long node;
	long weight;
} list;

typedef struct nodeDP {
	long d;
	long parent;
} nodeDP;

long cmpNDP(const void* a, const void* b)
{
	nodeDP* A = (nodeDP*)a;
	nodeDP* B = (nodeDP*)b;
	return (A->d - B->d);
}

long cmpList(const void* a, const void* b)
{
	list* A = (list*)a;
	list* B = (list*)b;
	return (A->weight - B->weight);
}

list priorityQueue[100];
long queueIndex = 0;

void push(long node_src, long weight_src)
{
	list element;
	element.node = node_src;
	element.weight = weight_src;
	if (queueIndex < 100)
		priorityQueue[queueIndex++] = element;
	else
		return;
}

long pop()
{
	long aux = priorityQueue[0].node;
	for (long i = 0; i < queueIndex - 1; i++)
		priorityQueue[i] = priorityQueue[i + 1];
	queueIndex--;
	return aux;
}

graph readGraph(const char* filename) {
	FILE* f = fopen(filename, "r");
	graph newGraph;

	if (!f)
		return;
	fscanf(f, "%d %d\n", &newGraph.numNodes, &newGraph.numEdges);

	newGraph.numNodes++;

	newGraph.matrix = (long**)malloc(sizeof(long*) * newGraph.numNodes);
	for (long i = 0; i < newGraph.numNodes; i++)
		newGraph.matrix[i] = (long*)malloc(sizeof(long) * newGraph.numNodes);

	for (long i = 0; i < newGraph.numNodes; i++) {
		for (long j = 0; j < newGraph.numNodes; j++)
			newGraph.matrix[i][j] = inf;
		newGraph.matrix[i][i] = 0;
	}

	long aux_i, aux_j, cost;

	for (long i = 0; i < newGraph.numEdges; i++) {
		fscanf(f, "%d %d %d\n", &aux_i, &aux_j, &cost);
		newGraph.matrix[aux_i][aux_j] = cost;
	}

	fclose(f);

	return newGraph;
}

void dijkstra(graph graph_src) {

	nodeDP* NDP = (nodeDP*)malloc(sizeof(nodeDP) * graph_src.numNodes);

	for (long i = 0; i < graph_src.numNodes; i++) {
		NDP[i].d = inf;
		NDP[i].parent = -1;
	}

	push(1, 0);

	long visited[100] = { 0 };

	while (queueIndex != 0) {
		for (long i = 1; i < graph_src.numNodes; i++)
			if (!visited[i] && graph_src.matrix[priorityQueue[0].node][i] != 0 && graph_src.matrix[priorityQueue[0].node][i] != inf) {
				push(i, graph_src.matrix[priorityQueue[0].node][i]);
				if (NDP[priorityQueue[0].node].parent == -1) {
					NDP[i].d = graph_src.matrix[priorityQueue[0].node][i];
					NDP[i].parent = priorityQueue[0].node;
				}
				else if (NDP[i].d > graph_src.matrix[priorityQueue[0].node][i] + NDP[priorityQueue[0].node].d) {
					NDP[i].d = graph_src.matrix[priorityQueue[0].node][i] + NDP[priorityQueue[0].node].d;
					NDP[i].parent = priorityQueue[0].node;
				}
			}
		visited[pop()] = 1;
		qsort(priorityQueue, queueIndex, sizeof(list), cmpList);
	}

	FILE* out = fopen("dijkstra.out", "w");

	for (long i = 2; i < graph_src.numNodes; i++) {
		if (NDP[i].d == inf)
			fprintf(out, "%d ", 0);
		else
			fprintf(out, "%d ", NDP[i].d);
	}

	fclose(out);
}

long main() {
	graph newGraph = readGraph("dijkstra.in");

	dijkstra(newGraph);

	return 0;
}