Cod sursa(job #12004)

Utilizator raula_sanChis Raoul raula_san Data 2 februarie 2007 16:44:53
Problema Triplete Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include<stdio.h>

#define dim 1<<12
#define DIM 1<<7
#define Max 1<<16

int N, A[dim][DIM], x[Max], y[Max]; long M, Sol;

void read();
void solve();
void write();

int main()
{
    read();
    solve();
    write();
    
    return 0;
}

void read()
{
     freopen("triplete.in", "r", stdin);
     scanf("%d %ld", &N, &M);
     
     long i; int a, b, pos, mask;
     for(i=1; i<=M; ++i)
     {
              scanf("%d %d", &a, &b);
              //adaug in lista lui a pe b
              pos = b / 32;
              mask = 1<<(b%32);
              A[a][pos] |= mask;
              //adaug in lista lui b pe a
              pos = a / 32;
              mask = 1<<(a%32);
              A[b][pos] |= mask;
              x[i] = a; y[i] = b;
     }
     fclose(stdin);
}

void solve()
{
	 long i; int j, mask, a, b, k, maska, maskb, byte;
     for(i=1; i<=M; ++i)
     {
              a = x[i]; b = y[i];
              for(j=0; j<=N/32; ++j)
              {
                       mask = A[a][j] & A[b][j];
					   maska = A[a][j];
					   maskb = A[b][j];

					   for(k=0, byte=0; mask; mask>>=1, ++byte)
							if(mask&1)
							{
								++ k;
								//elimin muchia de la a la nodul comun
								maska ^= 1<<byte;
								//elimin muchia de la b la nodul comun
								maskb ^= 1<<byte;
                                //elimin muchiile catre a si b de la nodul comun
								A[byte][a/32] ^= 1<<(a%32);
								A[byte][b/32] ^= 1<<(b%32);
							}
                                
					   Sol += k;
                       //actualizez listele de adiacenta ale lui a si b
					   A[a][j] = maska;
					   A[b][j] = maskb;
              }
     }
}

void write()
{
     freopen("triplete.out", "w", stdout);
     printf("%ld", Sol);
     fclose(stdout);
}