Pagini recente » Cod sursa (job #2905127) | Cod sursa (job #748499) | Cod sursa (job #3202432) | Cod sursa (job #742410) | Cod sursa (job #1193662)
#include <algorithm>
#include <cstdio>
#include <unordered_set>
#include <queue>
#include <vector>
using namespace std;
const int Nmax = 30005;
unordered_set<int> G[Nmax];
queue<int> Q;
int N, Sol, Solcnt;
int nodes[7], nrnodes;
vector<int> Tnodes;
void Back(const int k)
{
if (k == int(Tnodes.size()))
{
if (nrnodes > Sol)
Sol = nrnodes,
Solcnt = 1;
else if(nrnodes == Sol)
Solcnt++;
return;
}
const int node = Tnodes[k];
bool ok = 1;
for (int i = 1; i <= nrnodes; i++)
{
if (G[nodes[i]].find(node) == G[nodes[i]].end())
ok = 0;
}
if (ok)
{
nodes[++nrnodes] = node;
Back(k + 1);
nrnodes--;
}
Back(k + 1);
}
int main()
{
freopen("count.in", "r", stdin);
freopen("count.out", "w", stdout);
int M;
scanf("%d%d", &N, &M);
while (M--)
{
int x, y;
scanf("%d%d", &x, &y);
G[x].insert(y);
G[y].insert(x);
}
for (int i = 1; i <= N; i++)
if (G[i].size() < 6)
Q.push(i);
while (!Q.empty())
{
const int node = Q.front();
Q.pop();
Tnodes = vector<int> (G[node].begin(), G[node].end());
nodes[nrnodes = 1] = node;
Back(0);
for (auto p: G[node])
{
G[p].erase(node);
if (G[p].size() == 5U)
Q.push(p);
}
G[node].clear();
}
printf("%d %d\n", Sol, Solcnt);
}