Cod sursa(job #1631086)

Utilizator ErikHEErik Henning ErikHE Data 5 martie 2016 13:05:47
Problema Count Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>
#include <bitset>
#include <vector>
#include <unordered_set>
#include <queue>
#define nmax 30005
using namespace std;
unordered_set <int> v[nmax];
unordered_set <int> :: iterator a,b,c;
queue <int> q;
bitset <nmax> u;
int n,m,clique3,clique4;




inline void countclique()
{
    int i,nod;
    for (i=1;i<=n;i++)
        if (v[i].size()<6)
            q.push(i),u[i]=1;

    while (!q.empty()) {
            nod=q.front();
            q.pop();
            for (a=v[nod].begin();a!=v[nod].end();a++)
                for (b=a,b++;b!=v[nod].end();b++) {

                    if (v[*b].count(*a))
                        clique3++;

                    for (c=b,c++;c!=v[nod].end();c++)
                        if (v[*c].count(*a)&&v[*c].count(*b))
                            clique4++;
                }

            for (a=v[nod].begin();a!=v[nod].end();a++) {
                v[*a].erase(nod);
                if (u[*a]==0&&v[*a].size()<6)
                    q.push(*a);
            }
            v[nod].clear();
    }



}
int main()
{
    ifstream f("count.in");
    ofstream g("count.out");
    f>>n>>m;

    int i,j,p,t;
    for (i=1;i<=m;i++) {
        f>>p>>t;
        v[p].insert(t);
        v[t].insert(p);
    }
    countclique();
    if (clique4)
        g<<clique4<<"\t";
    else if (clique3)
        g<<clique3<<"\t";
    else
        g<<m<<"\t";
    return 0;
}