#include #include //using namespace std; //список смежных вершин struct elem { int name; elem *next; }; //вершина struct top { int name;//имя - порядковый номер вершины bool isdeleted;//была ли вершина удалена elem* list;//указатель на список смежных вершин } *tops; int n;//размер массива int k;//минимальное число членов идеологически невырожденной группы void add_elem(elem *&a, int b)//добавление элемента в список { if (!a) { a=new elem; a->name=b; a->next=NULL; } else { elem *cur=a; while (cur->next) cur=cur->next; cur->next=new elem; cur=cur->next; cur->name=b; cur->next=NULL; } } void calc_childrens(int index, int &childrens)//рекурсивная ф-ия вычисления кол-ва элементов в поддереве (результат в childrens) { elem *cur=tops[index].list; while (cur) { if (!tops[cur->name].isdeleted) calc_childrens(cur->name, ++childrens); cur=cur->next; } } int main() { std::cout<<"Enter filename with data: "; char filename[128]; std::cin>>filename; std::ifstream in; in.open(filename); if (in.fail()) { std::cout<<"ERROR! Can't open file "<>k>>n; tops=new top[n];//создаём массив из n вершин for (int i=0; i>temp; temp--; add_elem(tops[temp].list, i);//если родитель i-го элемента temp, то вершина с индексом temp смежна с вершиной i } in.close(); elem *deleted_tops=NULL;//список из удалённых вершин (сделан для удобства) int count=0;//кол-во удалений int childrens;//кол-во элементов в поддереве + сама вершина for (int i=n-1; i>=0; i--)//просматриваем массив вершин с конца, т.е. с листьев { childrens=1;//у любого поддерева есть хотя бы одна вершина calc_childrens(i, childrens);//вычисляем кол-во элементов if (childrens>=k)//проверяем условие { tops[i].isdeleted=true;//удалем вершину посредством изменения соответствующего поля add_elem(deleted_tops, i);//добавляем удалённую вершину в список удалённых count++; } } std::cout<<"Enter filename to save data: "; std::cin>>filename; std::ofstream out; out.open(filename); if (out.fail()) { std::cout<<"ERROR! Can't save file "<name+1<<" "; deleted_tops=deleted_tops->next; } return 0; }