最大クリーク問題は一般にNP困難ですが、本問題では「各頂点の次数は 以下」という制約があるので、うまく多項式時間で解くことが出来ます。
頂点 を含んだ完全グラフの頂点の候補は、その頂点とそれに隣接した頂点の最大 つです。
また、頂点 を必ず含むので、それを除いた つの取捨選択をbit全探索を用いて試せばよいです。
以上より、計算量はです。
n, m = map(int,input().split())
G = [[]for _ in range(n)]
E = set()
for i in range(m):
a, b = map(int,input().split())
a -= 1
b -= 1
G[a].append(b)
G[b].append(a)
E.add((a,b))
E.add((b,a))
ans = 0
for i in range(n):
l = len(G[i])
for j in range(1<<l):
A = [i]
for k in range(l):
if(j>>k & 1):
A.append(G[i][k])
bl = True
for a in range(len(A)):
for b in range(a+1, len(A)):
if((A[a],A[b]) not in E and (A[b],A[a]) not in E):
bl = False
if(bl):
ans = max(ans,len(A))
print(ans)
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> graph(n);
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
u--, v--;
graph[u].push_back(v);
graph[v].push_back(u);
}
int ans = 2;
for (int i = 0; i < n; i++) {
int cnt = 0;
for (int to : graph[i]) {
for (int find : graph[i]) {
cnt += count(graph[to].begin(), graph[to].end(), find);
}
}
if(cnt > 0) ans = max(ans, 3);
if(cnt == 6) ans = max(ans, 4);
}
cout << ans << endl;
}