Как найти минимальное остовное дерево с заданным набором координат из входного файла, используя алгоритм Прима?

Хорошо, ребята, я не видел этого нигде в интернете, и я пытался выяснить это в течение нескольких дней. Как я могу найти MST набора координат из входного файла, используя алгоритм Прима. Есть несколько вещей о том, как это сделать, но следуя им и будучи новичком в C ++, они не сильно помогают. Может кто-нибудь показать мне CODE (желательно), как решить эту проблему?

Предположим, у меня есть набор координат во входном файле «Something.txt», содержащем:
(N количество узлов / вершин)
(х координата), (координата у)
так далее…

Например:

9
50 100
100 150
200 150
300 150
350 100
300 50
200 50
100 50
150 100

Учитывая, что эти точки уже построены, как будет записан алгоритм Прима? Я понимаю, что это очень много, но я запутался в этом как новый ученик C ++. (и да, я пытался вычеркнуть код, я попытался просмотреть другие примеры и перевернуть их, чтобы заставить его работать, я перепробовал практически все, кроме того, чтобы посмотреть, как это делается, чтобы я мог лучше понять, что я пропустить.)

Заранее спасибо.

Редактировать: код, отображающий точки через пиктограмму с использованием входного файла аргумента .txt, который вы передаете ему, который затем помещается в файл .dat, который затем публикуется через предварительно созданный файл графика:

class Point
{

public:

// Constructor.
Point()
{
x = 0; y = 0;
} // end constructor
Point(int a, int b, int id)
{
x = a; y = b; pointID = id;
} // end constructor

int getX() { return x; }
int getY() { return y; }
int getID() { return pointID; }
string data;

Point(string x)
{
data = x;
}

private:
int x = 0;
int y = 0;
int v;
int xVert;
int yVert;
int pointID = 0;

list<Point*> pointList;
list<Point*> neighbors;
//vector<Neighbor> myNeighborvector;

//locate point containg value x
Point * findPoint(string x)
{
for(Point * v : pointList)
{
if (v->data == x)
return v;
}
return NULL;
}

//add Neighbor going from x to y
void addDirectedNeighbor(string x, string y)
{
Point * xVert = findPoint(x);
Point * yVert = findPoint(y);

xVert->neighbors.push_back(yVert); //I would think that this should only add y to x's neighbors, but when I try to display I  get x as one of y's neighbors
}

void addNeighbor(string x, string y)
{
addDirectedNeighbor(x, y);
addDirectedNeighbor(y, x);
}

}; // end class Point//--------------------------------------------------------------------------
class Edge
{

public:

// Constructor.
Edge()
{

} // end constructor
Edge(Point ptA, Point ptB)
{
pointA = ptA;
pointB = ptB;
length = sqrt(pow(abs(pointA.getX() - pointB.getX() ), 2) + pow(abs(pointA.getY() - pointB.getY() ), 2) );
} // end constructor

Point getPtA() { return pointA; }
Point getPtB() { return pointB; }
double getLen() { return length; }
int getPtAID() { return pointA.getID(); }
int getPtBID() { return pointB.getID(); }

private:
Point pointA;
Point pointB;
double length;

}; // end class Edge

//--------------------------------------------------------------------------
/*class Neighbor
{

public:

// Constructor.
Neighbor()
{
length = sqrt(pow(abs(pointA.getX() - pointB.getX() ), 2) + pow(abs(pointA.getY() - pointB.getY() ), 2) );
} // end constructor

double getLen() { return length; }

private:
double length;
int pointID = 0;

};*/ // end class Neighbor

vector<Point> myPointvector;  // vector will expand as needed
vector<Edge> MinSpanTree;

int main (int argc, char *argv[])
{
ifstream fin;
int coordPairs;  // number of coordinate pairs in the file
int ptX, ptY;

int loopCounter;
int pointCounter = 0;
double MSTLength = 0.0;// Check the number of arguments. Expected: filename of a file
if (argc != 2)  // This check is often hardcoded
{   // If failure in parameters, offer advice for correction
cout << "\nThis program uses command-line argument.\n";
cout << "Usage: a.exe <filename>\n";
exit(0);
}try  // All lines within this block are part of the same exception handler
{
fin.open(argv[1]);
}
catch (exception& ex)
{
cout << ex.what();  // display standard explanation of the exception
exit(0);  // exit the program
}// Read from the file, one token at a time. If the type of token is known, it
// can be read into a corresponding variable type, such as
//          in >> x;    // Read the first item into an integer variable x.
//          in >> str;  // Read the next item into a string variable str.// This line provides the graphic window setup.
cout << "800 600 white" << endl;

fin >> coordPairs;
cout << coordPairs << endl;
while (fin >> ptX)
{
// Do something with the element read from the file
// cout << ptX << endl;
fin >> ptY;
// cout << ptY << endl;

cout << "circle " << ptX << " " << ptY << " " << 20 << " seagreen" << endl;Point dummyPoint(ptX, ptY, pointCounter++);
myPointvector.push_back(dummyPoint);  // vector will expand as needed

cout << "Now myPointvector has size " << myPointvector.size() << endl;} // end while

fin.close();

return 0;
}

0

Решение

Это займет несколько итераций.

У тебя есть Point и векторы. Теперь напишите функцию для вычисления расстояния между двумя точками и функцию для чтения файла данных и создания вектора точек. Также напишите класс Neighbor который содержит идентификационный номер и расстояние, и дать Point элемент данных, который является вектором Neighbor,

Затем дайте Точке некоторые функции-члены: 1) добавить Соседа, 2) удалить Соседа (указанный в ID) и 3) вернуть копию ближайшего Соседа Точки.

Как только это будет сделано, попробуйте получить одно очко, , от вектора, затем итерации по оставшемуся вектору, вычисляя расстояние от друг к другу Точка в свою очередь, и здание Собрание соседей.

Оставьте комментарий к этому ответу, когда все это работает.

РЕДАКТИРОВАТЬ 1:
Это многообещающее начало, но жизненно важно, чтобы каждая итерация кода была правильной. Он не должен делать все (или что-то изначально), но он должен: 1) скомпилировать и 2) запустить без сбоев. Этот код не компилируется. В Neighbor()Вы ссылаетесь на pointA а также pointB без объявления их; они должны быть аргументами для конструктора. В PointВы ссылаетесь на vertex, findVertex, xvert а также neighbors, ни один из которых не определен или даже объявлен. (The Edge Класс интересен, но не ясно, как вы собираетесь его использовать.)

Берегите Point а также Neighbor классы (или отказаться Neighbor в пользу Edge), чтобы они могли компилировать и запускать, даже если они не достигли многого. Я вернусь через несколько часов.

РЕДАКТИРОВАТЬ 2:
В последней версии кода есть несколько функций, которые могут оказаться ненужными, но посмотрим.

Идея состоит в том, чтобы построить дерево, так как это будет работать с этими классами? Попробуйте написать небольшую тестовую функцию, которая создает три точки (с жестко заданными значениями) и собирает их в дерево. Как только это сработает, подумайте, как бы вы применили алгоритм Прима к этим трем пунктам.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]