Gán số cho các nút từ 1 đến n.
Chọn số nút 1. Gọi tên là 'A'.
Liệt kê các cặp liên kết sắp ra từ 'A'.
Chọn một. Hãy gọi các nút lân cận 'B' và 'C' với B nhỏ hơn C.
Nếu B và C được kết nối, sau đó xuất chu trình ABC, quay lại bước 3 và chọn một cặp khác.
Nếu B và C are not connected:
- liệt kê tất cả các nút kết nối với B. Giả sử nó kết nối với D, E, và F. Tạo một danh sách các vectơ CABD, CABE, CABF. Đối với mỗi:
- nếu nút cuối cùng được kết nối với bất kỳ nút nội trừ C và B, loại bỏ các vector
- nếu nút cuối cùng được kết nối với C, sản lượng và loại bỏ
- nếu nó không được kết nối với một trong hai , tạo danh sách các vectơ mới, thêm tất cả các nút mà nút cuối cùng được kết nối.
Lặp lại cho đến khi bạn hết các vectơ.
Lặp lại các bước 3-5 với tất cả các cặp.
Xóa nút 1 và tất cả các liên kết dẫn đến nút đó. Chọn nút tiếp theo và quay lại bước 2.
Chỉnh sửa: và bạn có thể thực hiện với một vòng lặp lồng nhau.
Điều này dường như làm việc ở cái nhìn đầu tiên, có thể có lỗi, nhưng bạn sẽ nhận được các ý tưởng:
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);
}
}
}
}
}
@aioobe: Không có ràng buộc, nhưng điều đó sẽ * quá * không hiệu quả. – kennytm
Tôi không làm tốt lắm để đăng một liên kết tới một tờ giấy phía sau tường rào. – Beta
@Beta: đôi khi có - tham chiếu đến các giấy tờ hữu ích, + ACM không chính xác là một tạp chí kỹ thuật tối nghĩa. (mặc dù tôi không có quyền truy cập vào nó) hoặc là –