hdu1530Maximum Clique(最大团)
题目描述:
Given a graph G(V, E), a clique is a sub-graph g(v, e), so that for all vertex pairs v1, v2 in v, there exists an edge (v1, v2) in e. Maximum clique is the clique that has maximum number of vertex.
思路:这是一道最大团裸题,也是我第一道最大团的题目,算法总结就是暴力选择,两种可能,选或者不选,
能选的条件是当前选择出的团中的所有点与该点连有边,然后有个最优解剪枝,看了别人的模板后自己写了一份模板,代码内有注释
AC代码:
#include<bits/stdc++.h> using namespace std; const int maxn = 55; typedef long long ll; int n; int g[maxn][maxn]; vector<int>haschose;//选择了的 int bestn;//最大团 int nowcn;//当前团个数(haschose.size()) void Maxclue(int u) { if (u> n) {//找出一个可行团 bestn = max(bestn, nowcn); return; } bool ok = 1; for (int& v : haschose) {//看是否能和当前选出的团组合成最大团 if (!g[u][v]) { ok = 0; break; } } if (ok) {//可以选就选 haschose.push_back(u); nowcn++; Maxclue(u + 1); nowcn--; haschose.pop_back(); } if (n - u + nowcn <= bestn)return;//就算把之后所有点都选上都不能超过当前得出的最大团,剪枝 Maxclue(u + 1);//不选 } int main() { //freopen("test.txt", "r", stdin); while (scanf("%d", &n) && n) { bestn = nowcn = 0;//初始化 for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { scanf("%d", &g[i][j]); //g[i][j]=g[j][i]=1;//我之前这样写的你敢信... } } Maxclue(1); printf("%d\n", bestn); } return 0; }