Хорошо, ребята, я не видел этого нигде в интернете, и я пытался выяснить это в течение нескольких дней. Как я могу найти 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;
}
Это займет несколько итераций.
У тебя есть 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:
В последней версии кода есть несколько функций, которые могут оказаться ненужными, но посмотрим.
Идея состоит в том, чтобы построить дерево, так как это будет работать с этими классами? Попробуйте написать небольшую тестовую функцию, которая создает три точки (с жестко заданными значениями) и собирает их в дерево. Как только это сработает, подумайте, как бы вы применили алгоритм Прима к этим трем пунктам.
Других решений пока нет …