- #include <stdio.h>
- #include "genlib.h"
- #include "simpio.h"
- #include "pqueue.h"
- #include "primkruskal.h"
- #define MAX_CONST 10000
- int graph[MAX_CONST][MAX_CONST];
- int nNodes;
- int total;
- /* Prototypes */
- void getDist(void);
- bool isAUnion(edgeADT edge, int *nodeId);
- /* Code */
- void getDist() {
- int i, j;
- FILE *OPEN;
- string DIST_PATH;
- printf("Enter the name of the file: ");
- DIST_PATH = GetLine();
- OPEN = fopen(DIST_PATH, "r");
- fscanf(OPEN, "%d", &nNodes);
- for(i = 0; i < nNodes; ++i) {
- for(j = 0; j < nNodes; ++j) {
- fscanf(OPEN, "%4d", &graph[i][j]);
- }
- }
- fclose(OPEN);
- /* Mark all nNodes as NOT beeing in the minimum spar */
- /*for(i = 0; i < nNodes; ++i) {
- inTree[i] = 0;
- }*/
- system("cls");
- }
- bool isAUnion(edgeADT edge, int nodeId[]){
- if(nodeId[edge.i] == nodeId[edge.j] && nodeId[edge.i] > 0) {
- return TRUE;
- } else {
- return FALSE;
- }
- }
- void kruskal() {
- int i, j, *nodeId, nextId = 0, temp, total = 0;
- edgeADT edge;
- pqueueADT queue = NewPQueue();
- getDist();
- nodeId = NewArray(nNodes, int);
- for(i = 0; i < nNodes; i++) {
- for(j = 0; j < nNodes; j++) {
- if(graph[i][j] != 0 && graph[i][j] != MAX_CONST) {
- edge.value = graph[i][j];
- edge.i = i;
- edge.j = j;
- Enqueue(queue, edge);
- }
- }
- }
- SortQueue(queue);
- for(i = 0; i < nNodes; i++) {
- nodeId[i] = 0;
- }
- // First tree
- edge = DequeueMin(queue);
- nodeId[edge.i] = nextId;
- nodeId[edge.j] = nextId;
- nextId++;
- //total += edge.value;
- //printf("Adding edge %d - %d = %d\n", edge.i, edge.j, edge.value);
- // Rest of tree
- while(!IsEmpty(queue)) {
- edge = DequeueMin(queue);
- if(!isAUnion(edge, nodeId)){
- if(nodeId[edge.i] == 0 && nodeId[edge.j] == 0) { //New tree
- nodeId[edge.i] = nextId;
- nodeId[edge.j] = nextId;
- nextId++;
- } else if(nodeId[edge.i] != 0 && nodeId[edge.j] != 0) { //Merge tree
- temp = nodeId[edge.j];
- for(i = 0; i < nNodes; i++){
- if(nodeId[i] == temp) {
- nodeId[i] = nodeId[edge.i];
- }
- }
- } else if(nodeId[edge.i] == 0 && nodeId[edge.j] != 0){ //Single node
- nodeId[edge.i] = nodeId[edge.j];
- } else if(nodeId[edge.j] == 0 && nodeId[edge.i] != 0){
- nodeId[edge.j] = nodeId[edge.i];
- }
- printf("Adding edge %d - %d = %d\n", edge.i, edge.j, edge.value);
- total += edge.value;
- }
- }
- printf("Size of graph: %d\n\n", total);
- }
- void prims() {
- edgeADT edge;
- bool *nodes;
- int currentNode, freeNodes, i, total;
- pqueueADT queue = NewPQueue();
- currentNode = 0;
- total = 0;
- getDist();
- freeNodes = nNodes-1;
- nodes = NewArray(nNodes, bool);
- for(i = 0; i < nNodes; i++){
- nodes[i] = 0;
- }
- //Insert first node into MST
- nodes[0] = 1;
- freeNodes--;
- while(TRUE) {
- for(i = 0; i <= nNodes - 1; i++) {
- if(graph[currentNode][i] != 0) {
- edge.i = currentNode;
- edge.j = i;
- edge.value = graph[currentNode][i];
- Enqueue(queue, edge);
- }
- }
- SortQueue(queue);
- do{
- edge = DequeueMin(queue);
- } while(nodes[edge.j]);
- printf("Adding edge %d - %d = %d\n", edge.i, edge.j, edge.value);
- total += edge.value;
- nodes[edge.j] = 1;
- currentNode = edge.j;
- if(freeNodes == 0) break;
- freeNodes--;
- }
- printf("Size of graph: %d\n\n", total);
- system( "pause" );
- }