Ответ 1
Назначить номера узлам от 1 до n.
-
Выберите номер node 1. Назовите его "A".
-
Перечислить пары ссылок, выходящих из "A".
-
Выберите один. Пусть вызываются соседние узлы "B" и "C", а B меньше C.
-
Если B и C подключены, выведите цикл ABC, вернитесь к шагу 3 и выберите другую пару.
-
Если B и C не связаны:
- Перечислите все узлы, подключенные к B. Предположим, что он подключен к D, E и F. Создайте список векторов CABD, CABE, CABF. Для каждого из них:
- если последний node подключен к любому внутреннему node, кроме C и B, отбрасывает вектор
- если последний node подключен к C, выводит и отбрасывает
- Если он не подключен к другому, создайте новый список векторов, добавив все узлы, к которым подключен последний node.
Повторяйте до тех пор, пока не закончите векторы.
-
Повторите шаги 3-5 со всеми парами.
-
Удалите node 1 и все ссылки, которые приводят к нему. Выберите следующий node и вернитесь к шагу 2.
Изменить: и вы можете покончить с одним вложенным циклом.
Это, кажется, работает с первого взгляда, могут быть ошибки, но вы должны понять:
void chordless_cycles(int* adjacency, int dim)
{
for(int i=0; i<dim-2; i++)
{
for(int j=i+1; j<dim-1; j++)
{
if(!adjacency[i+j*dim])
continue;
list<vector<int> > candidates;
for(int k=j+1; k<dim; k++)
{
if(!adjacency[i+k*dim])
continue;
if(adjacency[j+k*dim])
{
cout << i+1 << " " << j+1 << " " << k+1 << endl;
continue;
}
vector<int> v;
v.resize(3);
v[0]=j;
v[1]=i;
v[2]=k;
candidates.push_back(v);
}
while(!candidates.empty())
{
vector<int> v = candidates.front();
candidates.pop_front();
int k = v.back();
for(int m=i+1; m<dim; m++)
{
if(find(v.begin(), v.end(), m) != v.end())
continue;
if(!adjacency[m+k*dim])
continue;
bool chord = false;
int n;
for(n=1; n<v.size()-1; n++)
if(adjacency[m+v[n]*dim])
chord = true;
if(chord)
continue;
if(adjacency[m+j*dim])
{
for(n=0; n<v.size(); n++)
cout<<v[n]+1<<" ";
cout<<m+1<<endl;
continue;
}
vector<int> w = v;
w.push_back(m);
candidates.push_back(w);
}
}
}
}
}