Cod sursa(job #1730727)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 17 iulie 2016 15:42:18
Problema Count Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include<cstdio>
#include<vector>
#include<unordered_set>
#define MAXN 30010
using namespace std;
unordered_set<int> g[MAXN];
unordered_set<int> nodes;
vector<int> Stack;
int n,m,best=0,howMany;
bool Check(int node){
    int i;
    for(i=0;i<Stack.size();i++)
        if(node<Stack[i]||g[node].count(Stack[i])==0)
            return false;
    return true;
}
void Backtracking(unordered_set<int> &List,int level){
    unordered_set<int>::iterator it;
    if(level>best){
        best=level;
        howMany=1;
    }
    else
        if(level==best)
            howMany++;
    for(it=List.begin();it!=List.end();it++)
        if(Check(*it)==true){
            Stack.push_back(*it);
            Backtracking(List,level+1);
            Stack.pop_back();
        }
}
void Solve(){
    int node;
    unordered_set<int>::iterator it;
    while(!nodes.empty()){
        node=*nodes.begin();
        nodes.erase(nodes.begin());
        Backtracking(g[node],1);
        for(it=g[node].begin();it!=g[node].end();it++){
            g[*it].erase(node);
            if(g[*it].size()<6)
                nodes.insert(*it);
        }
    }
}
int main(){
    freopen("count.in","r",stdin);
    freopen("count.out","w",stdout);
    int i,a,b;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++){
        scanf("%d%d",&a,&b);
        g[a].insert(b);
        g[b].insert(a);
    }
    for(i=1;i<=n;i++)
        if(g[i].size()<6)
            nodes.insert(i);
    Solve();
    printf("%d %d",best,howMany);
    return 0;
}