Pagini recente » Cod sursa (job #2469319) | Cod sursa (job #499182) | Cod sursa (job #781559) | Cod sursa (job #3270435) | Cod sursa (job #325202)
Cod sursa(job #325202)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define in "triplete.in"
#define out "triplete.out"
#define NMAX 512
#define MASK (0x80)
#define MMAX (1<<16)+1
#define BYTEMAX (1<<7)+2
typedef struct set {
char *f;
} *PSet, Set;
PSet L;
void Add ( int i, int j )
{
unsigned char a = MASK;
int C, R;
C = (j>>3);
R = j - (C<<3);
a >>= R;
L[i].f[C] |= a;
}
int q[MMAX][2], ind, N, M;
int nrsol;
int cnt[BYTEMAX];
int main ( void )
{
freopen ( in, "r", stdin );
freopen ( out, "w", stdout );
unsigned char a;
int i, j, k, l;
for ( i = 1; i < BYTEMAX; ++i )
cnt[i] = cnt[i>>1] + (i&1);
scanf ( "%d%d", &N, &M );
L = (PSet)calloc ( N+1,sizeof(Set) );
for ( i = 1; i <= N; ++i )
L[i].f = (char*)calloc ( (N>>3), sizeof(char) );
for ( ; M > 0; --M )
{
scanf ( "%d%d", &i, &j );
Add ( i, j );
Add ( j, i );
q[++ind][0] = i; q[ind][1] = j;
q[++ind][0] = j; q[ind][1] = i;
}
for ( k = 1; k <= ind; ++k )
{
i = q[k][0];
j = q[k][1];
for ( l = 0; l <= (N>>3); ++l )
{
a = ((L[i].f[l]) & (L[j].f[l]));
nrsol += cnt[a];
}
}
printf ( "%d\n", nrsol/6 );
for ( i = 1; i <= N; ++i )
free ( L[i].f );
free ( L );
return 0;
}