Pagini recente » Cod sursa (job #1145918) | Cod sursa (job #385929) | Cod sursa (job #1264136) | Cod sursa (job #2350098) | Cod sursa (job #749170)
Cod sursa(job #749170)
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream f("count.in");
ofstream g("count.out");
const int maxn=30002;
const int mod=666013;
vector<int>hash[mod];
vector<int>a[maxn];
int grade[maxn],n,m,i,x,y,list[6],back,j,r,gas,maxt,manyt;
bool been[maxn],been2[maxn];
inline void insert(int x)
{
int list=x%mod;
hash[list].push_back(x);
}
inline int find(int x,int y)
{
x=(x<<16)+y;
int list=x%mod;
vector<int>::iterator it;
for(it=hash[list].begin();it!=hash[list].end();++it)
if(*it==x)
break;
if(it==hash[list].end())
return 1;
return 0;
}
queue<int>Q;
int main()
{
f>>n>>m;
for(i=1;i<=m;++i)
{
f>>x>>y;
a[x].push_back(y);
a[y].push_back(x);
insert((x<<16)+y);
insert((y<<16)+x);
++grade[x];
++grade[y];
}
for(i=1;i<=n;++i)
if(grade[i]<6)
Q.push(i),been2[i]=true;
while(!Q.empty())
{
x=Q.front();
Q.pop();
been[x]=true;
y=0;
list[1]=list[2]=list[3]=list[4]=list[5];
for(vector<int>::iterator it=a[x].begin();it!=a[x].end();++it)
if(been[*it]==false)
{
list[++y]=*it;
--grade[*it];
if(grade[*it]<6&&been2[*it]==false)
Q.push(*it),been2[*it]=true;
}
back=(1<<y)-1;
for(back;back;--back)
{
gas=0;
for(j=0;(1<<j)<=back;++j)
if((1<<j)&back)
{
++gas;
for(r=j+1;(1<<r)<=back;++r)
if((1<<r)&back)
if(find(list[r+1],list[j+1]))
r=20,j=20;
}
if(r==21)continue;
if(gas+1>maxt)
maxt=gas+1,manyt=1;
else
if(gas+1==maxt)
++manyt;
}
}
g<<maxt<<" "<<manyt<<"\n";
f.close();
g.close();
return 0;
}