Nu aveti permisiuni pentru a descarca fisierul grader_test20.in
Cod sursa(job #1598597)
| Utilizator | Data | 13 februarie 2016 01:06:07 | |
|---|---|---|---|
| Problema | Count | Scor | 80 |
| Compilator | cpp | Status | done |
| Runda | Arhiva de probleme | Marime | 2.15 kb |
#include <bits/stdc++.h>
using namespace std;
set < int > g[20009];
set < int > :: iterator it;
set < pair < int , int > > aset;
set < pair < int , int > > :: iterator itP;
int deg[20009];
vector < int > tmp;
int ways[5] , n , m , _a , _b , _c , a , b , c , i , x;
int main()
{
freopen("count.in" , "r" , stdin);
freopen("count.out" , "w" , stdout);
scanf("%d" , &n);
scanf("%d" , &m);
for (i = 1 ; i <= m ; ++i)
{
scanf("%d" , &a);
scanf("%d" , &b);
g[a].insert(b);
g[b].insert(a);
deg[a] += 1 , deg[b] += 1;
}
for (i = 1 ; i <= n ; ++i)
aset.insert(make_pair(deg[i] , i));
for (i = 1 ; i <= n ; ++i)
{
x = (*aset.begin()).second;
tmp.clear();
for (it = g[x].begin() ; it != g[x].end() ; ++it)
tmp.push_back(*it);
// fac clica de 1
ways[1] += 1;
// fac clica de 2
ways[2] += deg[x];
// fac clica de 3
for (_a = 0 ; _a < tmp.size() ; ++_a)
{
a = tmp[_a];
for (_b = 0 ; _b < _a ; ++_b)
{
b = tmp[_b];
it = g[a].find(b);
if (it == g[a].end()) continue;
ways[3] += 1;
}
}
//fac clica de 4
for (_a = 0 ; _a < tmp.size() ; ++_a)
{
a = tmp[_a];
for (_b = 0 ; _b < _a ; ++_b)
{
b = tmp[_b];
it = g[a].find(b);
if (it == g[a].end()) continue;
for (_c = 0 ; _c < _b ; ++_c)
{
c = tmp[_c];
it = g[a].find(c);
if (it == g[a].end()) continue;
it = g[b].find(c);
if (it == g[b].end()) continue;
ways[4] += 1;
}
}
}
//elimin nodul
aset.erase(aset.begin());
for (_a = 0 ; _a < tmp.size() ; ++_a)
{
a = tmp[_a];
it = g[a].find(x);
g[a].erase(it);
itP = aset.find(make_pair(deg[a] , a));
aset.erase(itP);
deg[a]--;
aset.insert(make_pair(deg[a] , a));
}
}
for (i = 4 ; i ; --i)
if (ways[i]) break;
printf("%d %d\n" , i , ways[i]);
return 0;
}
