Untitled
unknown
plain_text
2 years ago
1.4 kB
18
Indexable
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 45;
int M[MAXN][MAXN];
int n;
bool selected[MAXN];
int maxSize = 0;
// 判斷當前選擇的學生是否構成一個團
bool isClique(int clique[], int size, int newStudent) {
for (int i = 0; i < size; ++i) {
if (M[clique[i]][newStudent] == 0) {
return false;
}
}
return true;
}
// 使用回溯法來找到最大的團
void findMaxClique(int pos, int clique[], int size) {
// 剪枝:如果剩餘學生數量不足以超過當前最大團大小,則終止遞迴
if (size + (n - pos) <= maxSize) {
return;
}
if (pos == n) {
if (size > maxSize) {
maxSize = size;
}
return;
}
// 不選擇當前學生
findMaxClique(pos + 1, clique, size);
// 剪枝:如果當前學生與已選擇的學生不構成團,則不選擇該學生
if (isClique(clique, size, pos)) {
clique[size] = pos;
findMaxClique(pos + 1, clique, size + 1);
}
}
int main() {
cin >> n;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin >> M[i][j];
}
}
int clique[MAXN];
memset(selected, false, sizeof(selected));
findMaxClique(0, clique, 0);
cout << maxSize << endl;
return 0;
}Editor is loading...
Leave a Comment