Pagini recente » Borderou de evaluare (job #1242511) | Borderou de evaluare (job #834530) | Cod sursa (job #635999) | Borderou de evaluare (job #2437547) | Cod sursa (job #1905785)
#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;
}