Cod sursa(job #1905785)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 6 martie 2017 10:51:20
Problema Count Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <cstdio>
#include <cstring>
#include <map>

#define x first
#define y second

#define MAXN 30000

int ans;
long long rez;

bool viz[MAXN+1];
int q[MAXN];

bool m[5][5];

int v[5];

std::map <int, bool> mp[MAXN+1];

inline void sol(int x, int y){
    if(ans==x) rez+=y;
    else if(x>ans) ans=x, rez=y;
}

int main(){
    FILE *fin, *fout;
    fin=fopen("count.in", "r");
    fout=fopen("count.out", "w");

    int n, u;
    fscanf(fin, "%d%d", &n, &u);

    for(int i=1; i<=u; i++){
        int x, y;
        fscanf(fin, "%d%d", &x, &y);

        mp[x][y]=1;
        mp[y][x]=1;
    }

    ans=1;
    rez=n;

    int st=0, dr=0;
    for(int i=1; i<=n; i++)
        if(mp[i].size()<=5)
            q[dr++]=i;

    while(st<dr){
        viz[q[st]]=1;
        for(auto x:mp[q[st]]){
            if(viz[x.x]==0){
                mp[x.x].erase(q[st]);
                if(mp[x.x].size()==5)
                    q[dr++]=x.x;
            }
        }
        st++;
    }

    for(int i=0; i<dr; i++){
        int k=0;
        for(auto x:mp[q[i]])
            v[k++]=x.x;
        memset(m, 0, sizeof m);
        for(int p=0; p<k; p++)
            for(int q=0; q<k; q++)
                if((mp[v[p]].find(v[q])!=mp[v[p]].end())||(mp[v[q]].find(v[p])!=mp[v[q]].end()))
                    m[p][q]=m[q][p]=1;

        sol(2, k);

        for(int p=0; p<k; p++)
            for(int q=p+1; q<k; q++)
                if(m[p][q])
                    sol(3, 1);
        for(int p=0; p<k; p++)
            for(int q=p+1; q<k; q++)
                for(int r=q+1; r<k; r++)
                    if((m[p][q])&&(m[p][r])&&(m[q][r]))
                        sol(4, 1);
    }

    fprintf(fout, "%d %lld\n", ans, rez);

    fclose(fin);
    fclose(fout);
    return 0;
}