Pagini recente » Cod sursa (job #1011846) | Cod sursa (job #2139892) | Monitorul de evaluare | Cod sursa (job #741668) | Cod sursa (job #1138502)
#include<stdio.h>
#include<vector>
#include<bitset>
#include<algorithm>
#include<tr1/unordered_set>
using namespace std;
const int NMAX = 3e5;
std::tr1::unordered_set <int> graph[NMAX + 5];
vector <int> dir, sub;
int n, cnt, maxsz, deg[NMAX + 5], vis[NMAX + 5];
bool isClique () {
for(int i = 0; i < sub.size(); ++ i)
for(int j = i + 1; j < sub.size(); ++ j)
if(!graph[sub[i]].count(sub[j]))
return 0;
return 1;
}
void countCliques () {
int i, j, num, s, bit;
num = 1 << dir.size();
for(s = 1; s <= num; ++ s) {
sub.clear();
for(bit = 0; bit < dir.size(); ++ bit)
if(s & (1 << bit))
sub.push_back(dir[bit]);
if(isClique()) {
if(sub.size() > maxsz)
maxsz = sub.size(),
cnt = 0;
if(sub.size() == maxsz)
++ cnt;
}
}
}
void dfs (int node) {
std::tr1::unordered_set <int>::iterator it;
dir.clear();
dir.push_back(node);
for(it = graph[node].begin(); it != graph[node].end(); ++ it)
if(!vis[*it])
dir.push_back(*it);
countCliques();
vis[node] = 1;
for(it = graph[node].begin(); it != graph[node].end(); ++ it)
if(!vis[*it])
-- deg[*it];
for(it = graph[node].begin(); it != graph[node].end(); ++ it)
if(!vis[*it] && deg[*it] < 6) {
dfs(*it);
return;
}
}
int main() {
freopen("count.in","r",stdin);
freopen("count.out","w",stdout);
int m, i, a, b;
scanf("%d%d",&n,&m);
for(i = 1; i <= m; ++ i) {
scanf("%d%d",&a,&b);
graph[a].insert(b);
graph[b].insert(a);
++ deg[a];
++ deg[b];
}
for(i = 1; i <= n; ++ i)
if(!vis[i] && deg[i] < 6)
dfs(i);
printf("%d %d\n",maxsz, cnt);
return 0;
}