Реализовать алгоритм Краскала - Lisp
Формулировка задачи:
Добрый день, друзьяшки. Помогите пожалуйста, кому не будет трудным
Препод дал такое задание:
Сделал это задание на C++, но лисп вобще не знаю, можете пожалуйста написать?)
Напишите две компьютерные программы (На С++ и на lisp (или на F#)), решающие следующую задачу:
Связный граф задан списком ребер. Каждое ребро представляет собой тройку (вершина, вершина, длина). Граф неориентированный. Найти минимальное остовное дерево (в виде списка образующих его ребер).
Листинг программы
- #include <iostream>
- #include <list>
- #include <limits>
- #include <iomanip>
- #include <algorithm>
- #include <iterator>
- #include <vector>
- #include <windows.h>
- using namespace std;
- #ifdef max
- #undef max
- #endif
- class Graph
- {
- struct edge
- {
- unsigned vertex1, vertex2, length;
- };
- list<edge> graph;
- unsigned vertexes, highestVertex;
- void correctInput(unsigned& arg)
- {
- while (!(cin >> arg))
- {
- cout << "\nНекорректный ввод, повторите попытку:" << endl;
- cin.clear();
- cin.sync();
- cin.ignore(numeric_limits<streamsize>::max(), '\n');
- }
- }
- void addEdge(void)
- {
- edge tempObj;
- graph.push_back(tempObj);
- system("cls");
- cout << "Производится ввод " << graph.size()
- << "-ого ребра...\n" << endl;
- cout << "Введите 1-ую вершину:" << endl;
- correctInput(graph.back().vertex1);
- cout << "Введите 2-ую вершину:" << endl;
- correctInput(graph.back().vertex2);
- cout << "Введите вес ребра:" << endl;
- correctInput(graph.back().length);
- if (graph.back().vertex1 > highestVertex)
- highestVertex = graph.back().vertex1;
- if (graph.back().vertex2 > highestVertex)
- highestVertex = graph.back().vertex2;
- system("cls");
- }
- public:
- static struct sortFunctor
- {
- bool operator() (const edge& arg1, const edge& arg2)
- {
- return arg1.length < arg2.length;
- }
- } sortObj;
- Graph(void) : vertexes(0), highestVertex(0)
- { }
- Graph(unsigned arg) : vertexes(arg), highestVertex(0)
- { }
- friend istream& operator>>(istream&, Graph&);
- friend ostream& operator<<(ostream&, const Graph&);
- };
- Graph::sortFunctor Graph::sortObj;
- istream& operator>>(istream& arg1, Graph& arg2)
- {
- if (!arg2.vertexes)
- {
- system("cls");
- cout << "Граф пустой, введите число его ребер:" << endl;
- arg2.correctInput(arg2.vertexes);
- }
- if (arg2.vertexes)
- {
- for (unsigned i(0); i < arg2.vertexes; i++)
- arg2.addEdge();
- system("cls");
- arg2.graph.sort(Graph::sortObj);
- }
- return arg1;
- }
- ostream& operator<<(ostream& arg1, const Graph& arg2)
- {
- vector<bool> table(arg2.highestVertex, false);
- system("cls");
- cout << "Ребра минимального остовного дерева:\n" << endl;
- for (unsigned i(0); i++ < 45; cout.put('-'));
- cout.put('\n');
- cout << setw(15) << "Вершина 1" << setw(3) << '|'
- << setw(12) << "Вершина 2" << setw(7) << '|'
- << setw(8) << "Вес" << endl;
- for (unsigned i(0); i++ < 45; cout.put('-'));
- cout.put('\n');
- list<Graph::edge>::const_iterator iter(arg2.graph.begin());
- for (; iter != arg2.graph.end(); iter++)
- {
- static unsigned index1, index2;
- index1 = iter->vertex1 - 1;
- index2 = iter->vertex2 - 1;
- if (!table[index1] || !table[index2])
- {
- table[index1] = true;
- table[index2] = true;
- cout << setw(15) << iter->vertex1
- << setw(3) << '|' << setw(12) << iter->vertex2
- << setw(7) << '|' << setw(8) << iter->length << endl;
- }
- }
- for (unsigned i(0); i++ < 45; cout.put('-'));
- return arg1;
- }
- int main(void)
- {
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- Graph gr(0);
- cin >> gr;
- cout << gr << endl;
- system("pause");
- return 0;
- }
Решение задачи: «Реализовать алгоритм Краскала»
textual
Листинг программы
- ;; Проверить ребро
- (defun chk-vert (v s)
- (let ((a1 (car v))
- (a2 (cadr v)))
- (not (forsome s (lambda (w) (and (member a1 w) (member a2 w)))))))
- ;; Добавление очередного ребра в "лес"
- (defun ins-vert (v w)
- (let* ((a1 (car v))
- (a2 (cadr v))
- (w1 (car (remove-if-not (lambda (x) (member a1 x)) w)))
- (w2 (car (remove-if-not (lambda (x) (member a2 x)) w))))
- (cond ((and (null w1) (null w2)) (cons (butlast v) w))
- ((null w1) (cons (cons a1 w2) (remove-if (lambda (x) (member a2 x)) w)))
- ((null w2) (cons (cons a2 w1) (remove-if (lambda (x) (member a1 x)) w)))
- (t (cons (append w1 w2) (remove-if (lambda (x) (or (member a1 x) (member a2 x))) w))))))
- ;; Очередной шаг
- (defun action (graph &optional (w nil) (r nil))
- (cond ((null graph) r)
- ((chk-vert (car graph) w) (action (cdr graph) (ins-vert (car graph) w) (append r (list (car graph)))))
- (t (action (cdr graph) w r))))
- (defun kruskal (graph)
- (let ((g (qsort-a graph (lambda (x) (nth 2 x)))))
- (action g)))
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д