Cod sursa(job #213262)

Utilizator cata00Catalin Francu cata00 Data 8 octombrie 2008 23:48:51
Problema Party Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

#define MAXN 110

typedef struct _list {
  int other;
  int relation;
  struct _list* next;
} list;

int reciprocal[4] = {0, 2, 1, 3};
int m, n;
list* clauses[MAXN];
int sol[MAXN];

void link(int x, int y, int r) {
  list* l = (list*)malloc(sizeof(list));
  l->other = y;
  l->relation = r;
  l->next = clauses[x];
  clauses[x] = l;
}

void read() {
  FILE* f = fopen("party.in", "rt");
  fscanf(f, "%d %d", &n, &m);
  for (int i = 1; i <= n; i++) {
    clauses[i] = NULL;
  }
  for (int i = 0; i < m; i++) {
    int x, y, r;
    fscanf(f, "%d %d %d", &x, &y, &r);
    link(x, y, r);
    link(y, x, reciprocal[r]);
  }
  fclose(f);
}

void traverse(int x, int value) {
  //printf("Traversing %d with value %d\n", x, value);
  if (sol[x] != -1) {
    //assert(sol[x] == value);
    //printf("Already done this\n");
    return;
  }
  sol[x] = value;
  for (list* l = clauses[x]; l; l = l->next) {
    //printf("Looking at clause %d %d %d\n", x, l->other, l->relation);
    switch (l->relation) {
    case 0:
      if (!value) {
        traverse(l->other, 1);
      }
      break;
    case 1:
      if (!value) {
        traverse(l->other, 0);
      }
      break;
    case 2:
      if (value) {
        traverse(l->other, 1);
      }
      break;
    case 3:
      if (value) {
        traverse(l->other, 0);
      }
      break;
    }
  }
}

void assign() {
  for (int i = 1; i <= n; i++) {
    sol[i] = -1;
  }
  for (int i = 1; i <= n; i++) {
    if (sol[i] == -1) {
      //printf("New iteration\n");
      traverse(i, 1);
    }
  }
}

void write() {
  FILE* f = fopen("party.out", "wt");
  int numComing = 0;
  for (int i = 1; i <= n; i++) {
    numComing += sol[i];
  }
  fprintf(f, "%d\n", numComing);
  for (int i = 1; i <= n; i++) {
    if (sol[i]) {
      fprintf(f, "%d\n", i);
    }
  }
  fclose(f);
}

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