Здравствуйте, Khimik, Вы писали:
K>Я честно говоря не понял, что вы имеете в виду под сотами? На второй картинке видно, что возможны смежные циклы — один атом входит в несколько циклов.
если есть такие циклы в которых — каждый их атом является и частью других циклов, то можно назвать это сотой (не знаю как по другому назвать) ..
у тебя на картинке — просто в каждом цикле есть атомы, которые не входят в другие циклы ..
я это обыграл в решении ..
K>>>Надо было ещё пояснить как создаётся массив соседей атомов.
K>Исходные данные — два массива: в первом перечислены атомы — тип атома и координаты x,y,z. Во втором перечислены связи — номера двух атомов которые друг с другом связаны.
K>Нужно создать для каждого атома динамический массив — атомы, связанные с ним, пробежаться циклом по связям и добавлять в эти динамические массивы соседние атомы для каждого атома.
ну если это "не игра на скорость", то
| Скрытый текст |
| // считаем что все атомы связаны хотя бы через один другой друг с другом
// топорный метод, но тебе вроде скорость профиг :))
struct atom {
int x,y,z;
//vector <struct atom *> neighborhoods; // links
vector <int> neighborhoods_indices;
};
vector <atom> atoms;
atoms.resize ( source_atoms_array.size() );
for (int i=0; i<source_atoms_array.size(); ++i) {
atoms[i].xyz = source_atoms_array[i].xyz; // условный код
}
bool have_neighborhood_link( const int atom_index, const int neighborhood_index ) {
for (int i=0; i<atoms[atom_index].neighborhoods_indices.size(); ++i) {
if ( neighborhood_index == atoms[atom_index].neighborhoods_indices[i] ) return true;
}
return false;
};
// сначала надо нафигачить линки (индексы) - на соседние атомы, в каждый атом массива atoms
for (int i=0; i<atom_links; ++i) {
if (false == have_neighborhood_link ( atom_links[i].index0, atom_links[i].index1 ) ) {
atoms[atom_links[i].index0].neighborhoods_indices.push_back( atom_links[i].index1);
}
if (false == have_neighborhood_link ( atom_links[i].index1, atom_links[i].index0 ) ) {
atoms[atom_links[i].index1].neighborhoods_indices.push_back( atom_links[i].index0);
}
}
// ну а далее по сути имеем готовый "список" (точнее граф) через индексы соседей (в массиве atoms), можно по нему бегать - а можно развернуть через прямые ссылки (указпатели) на список граф, начиная с любого элемента (назовём его первым) ..
|
| |