Алгоритм Примма на C

#c #algorithm #queue

#c #алгоритм #очередь

Вопрос:

Я работаю над проектом на C , который будет использовать алгоритм Примма для определения веса MST. Вот код, который у меня есть до сих пор:

 #include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <queue>
using namespace std;

const int maxVert = 'M'   1;
const int maxAns = maxVert - 'A';

struct edgeType
{
    char vertex1, vertex2;
    int weight;
};

struct qType
{
    char vertex1, vertex2;
    int weight;
    qType* link;
};

enum colorType { white, gray, black };
colorType color[maxVert];

void init(int adj[maxVert][maxVert], colorType color[maxVert], edgeType ans[maxAns]);
void createGraph(int adj[maxVert][maxVert]);
void printGraph(int adj[maxVert][maxVert], ofstreamamp; outf);
void createQueue(qType*amp; qHead, qType*amp; qTail);
bool emptyQueue(qType*amp; qHead, qType*amp; qTail);
void deQueue(qType* qHead, qType* qTail, charamp; vertex1, charamp; vertex2, intamp; weight);
void enQueue(qType* qHead, qType* qTail, char vertex1, char vertex2, int weight);
void mst(qType* qHead, qType* qTail, int adj[maxVert][maxVert], colorType color[maxVert], edgeType ans[maxAns], char startPoint, ofstreamamp; outf);

int main()
{   
    ofstream outf("output.ot");
    int adj[maxVert][maxVert];
    edgeType ans[maxAns];
    qType* qHead;
    qType* qTail;

    init(adj, color, ans);
    createGraph(adj);
    outf << "2D Adjacency Matrix:" << endl;
    printGraph(adj, outf);
    createQueue(qHead, qTail);
    mst(qHead, qTail, adj, color, ans, 'A', outf);

    return 0;
}

void init(int adj[maxVert][maxVert], colorType color[maxVert], edgeType ans[maxAns])
{
    for (int i = 0; i < maxVert; i  )
    {
        for (int j = 0; j < maxVert; j  )
        {
            adj[i][j] = 0;
            adj[j][i] = 0;
        }
    }

    for (int i = 0; i < maxVert; i  )
    {
        colorType color = white;
    }

    for (int i = 0; i < maxAns; i  )
    {
        ans->vertex1 = 0;
        ans->vertex2 = 0;
        ans->weight = 0;
    }
}

void createGraph(int adj[maxVert][maxVert])
{
    char vertex1, vertex2;
    int weight;
    fstream inf("input.dat");

    while (!inf.eof())
    {
        inf >> vertex1 >> vertex2 >> weight;
        adj[vertex1][vertex2] = weight;
        adj[vertex2][vertex1] = weight;
    }
}

void printGraph(int adj[maxVert][maxVert], ofstreamamp; outf)
{   
    int i, j;

    outf << setw(5) << " ";
    for (j = 'A'; j < maxVert; j  )
    {
        outf << setw(3) << (char)j;
    }
    outf << endl;
    
    for (i = 'A'; i < maxVert; i  )
    {
        outf << setw(5) << char(i);
        for (j = 'A'; j < maxVert; j  )
        {
            outf << setw(3) << adj[i][j];
        }
        outf << endl;
    }
    outf << endl;
}

void createQueue(qType*amp; qHead, qType*amp; qTail)
{
    qHead = new qType;
    qTail = new qType;  

    qHead->vertex1 = 'A';
    qTail->vertex1 = 'A';
    qHead->vertex2 = 'A';
    qTail->vertex2 = 'A';
    qHead->weight = 0;
    qTail-> weight = 0;

    qHead->link = qTail;
    qTail->link = NULL;
}

bool emptyQueue(qType*amp; qHead, qType*amp; qTail)
{
    return qHead->link == qTail;
}

void deQueue(qType* qHead, qType* qTail, charamp; vertex1, charamp; vertex2, intamp; weight)
{
    qType *c;
    c = qHead->link;
    qHead->link = c->link;
    vertex1 = c->vertex1;
    vertex2 = c->vertex2;
    weight = c->weight;
    delete c;
}

void enQueue(qType* qHead, qType* qTail, char ivertex1, char ivertex2, int weight)
{
    qType* knew, * next, * previous;
    knew = new qType;
    knew->vertex1 = ivertex1;
    knew->vertex2 = ivertex2;
    knew->weight = weight;
    previous = qHead;
    next = qHead->link;

    while ((next != qTail) amp;amp; (weight >= next->weight))
    {
        previous = next;
        next = next->link;
    }

    previous->link = knew;
    knew->link = next;
}

void mst(qType* qHead, qType* qTail, int adj[maxVert][maxVert], colorType color[maxVert], edgeType ans[maxAns], char startPoint, ofstreamamp; outf)
{
    //char vertex1, vertex2;
    //int weight;
    int counter = 0;
    enQueue(qHead, qTail, startPoint, 'X', 0);
    color[qHead->vertex1] = gray;
    while (!emptyQueue(qHead, qTail))
    {
        deQueue(qHead, qTail, qHead->vertex1, qHead->vertex2, qHead->weight);

        if (color[qHead->vertex1]!=black amp;amp; qHead->weight !=0)
        {
            ans[counter].vertex1 = qHead->vertex1;
            ans[counter].vertex2 = qHead->vertex2;
            ans[counter].weight = qHead->weight;
            counter  ;

            for (qHead->vertex2 = 'A'; qHead->vertex2 > 'M'; qHead->vertex2  )
            {
                if (adj[qHead->vertex1][qHead->vertex2] != 0 amp;amp; color[qHead->vertex2] != black)
                {
                    enQueue(qHead, qTail, qHead->vertex2, qHead->vertex1, adj[qHead->vertex1][qHead->vertex2]);
                    color[qHead->vertex2] = gray;
                }
            }
            color[qHead->vertex1] = black;
        }
    }   
    outf << ans->vertex1 << ans->vertex2 << ans->weight;
}
  

Я могу настроить свою матрицу смежности и присвоить значения веса, но у меня возникают проблемы с моей функцией mst. Я не уверен, использую ли я правильные переменные для передачи в мою очередь. Я хотел бы иметь возможность распечатать ребра и веса, которые охватывают это дерево, но я застрял. Любая помощь будет оценена.

Комментарии:

1. Вы, вероятно, получили бы (лучшие) ответы, если бы смогли сузить проблему, чтобы людям не приходилось читать страницы страниц кода.

2. «Я сталкиваюсь с проблемами с моей функцией mst». — Я бы предположил, что только люди, которые знают, в чем заключаются эти проблемы, смогут их решить. В этом случае эта информация не обсуждается, поэтому вы единственный человек, который знает, что это за проблемы…