Cod sursa(job #164027)

Utilizator alecmanAchim Ioan Alexandru alecman Data 23 martie 2008 14:05:27
Problema Oz Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include<stdio.h>

#define INPUT "oz.in"
#define OUTPUT "oz.out"
#define NMAX 10001
#define VMAX 2000000000

FILE *fin = fopen(INPUT, "r"),*fout = fopen(OUTPUT, "w");

typedef struct lista
{
  long value;
  struct lista *next;
};

lista *p[ NMAX ];

long N, M;
long minDiv[ NMAX ];

void readValues();

void solveFunction();

inline long euclid(long, long);

void printSolution();

int main()
{
  readValues();

  solveFunction();

  fclose(fin);
  fclose(fout);

  return 0;
}

void readValues()
{
  lista *adr;

  long nod1, nod2, diviz;

  fscanf(fin, "%ld %ld", &N, &M);

  for(long i = 0; i <= M; ++i)
  {
    fscanf(fin, "%ld %ld %ld", &nod1, &nod2, &diviz);

    adr = new lista;

    adr -> value = diviz;
    adr -> next = p[ nod1 - 1 ];
    p[ nod1  - 1 ] = adr;

    adr = new lista;

    adr -> value = diviz;
    adr -> next = p[ nod2 - 1 ];
    p[ nod2 - 1 ] = adr;
  }
}

void solveFunction()
{
  long long temp;

  int Valid = 1;

  lista *adr;

  for(long i = 0; i < N; ++i)
  {
    adr = p[ i ];

    minDiv[ i ] = adr -> value;

    while(adr -> next != NULL)
    {
      adr = adr -> next;

      temp = (long long)minDiv[ i ] * (long long) (adr -> value);

      minDiv[ i ] = temp / euclid(minDiv[ i ], adr -> value);

      if(minDiv[ i ] > VMAX)
      {
	fprintf(fout, "-1\n");

	Valid = 0;
      }
    }

  }

  if(Valid) printSolution();
}

inline long euclid(long A, long B)
{
  if(!B) return A;
  else return euclid(B, A%B);
}

void printSolution()
{
  for(long i = 0; i < N; ++i)
    fprintf(fout, "%ld ", minDiv[ i ]);

  fprintf(fout, "\n");
}