Cod sursa(job #1466646)

Utilizator stoianmihailStoian Mihail stoianmihail Data 29 iulie 2015 18:54:33
Problema PScNv Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.83 kb
#include <stdio.h>
#include <ctype.h>

#define Dragoste 10500100
#define Smerenie 500001
#define Nadejde 250001
#define MAX_K 1001
#define Mask 31

typedef struct {
  int v, k, next;
} cell;

unsigned int shl[Mask + 1] = {1, 2, 4, 8, 16, 32, 64, 128, 256,
512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144,
524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432,
67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648};

int N;
int M;
int X;
int Y;
char c;
int mid;
int pos;
int max = 1;
int adj[Nadejde];              /// capetele listelor de adiacenta.
cell l[Smerenie];              /// listele de adiacenta alocate static.
char buff[Dragoste];           /// bufferul oferit de sistem.
char seen[MAX_K][Nadejde]; /// bitul [i][j] este 1 doar daca am putut ajunge la j cu capacitatea i.

/** Returneaza urmatorul caracter din "f". **/
inline char getChar(FILE *f) {
  return buff[pos++];
}

/** Citeste urmatorul numar. **/
inline void read(FILE *f, int *result) {
  *result = 0;
  do {
    c = getChar(f);
  } while (!isdigit(c));
  do {
    *result = (*result << 3) + (*result << 1) + c - '0';
    c = getChar(f);
  } while (isdigit(c));
}

/** Inlocuim fscanf()-ul. **/
void freef(FILE *f, const char *arg, int *u, int *v, int *k) {
  read(f, &*u), read(f, &*v), read(f, &*k);
}
/*
 Seteaza bitul (k, u). /
void setBit(int k, int u) {
  seen[k][u >> 5] |= shl[Mask - (u & Mask)];
}

/ Este setat bitul (k, u). /
int getBit(int k, int u) {
  return (seen[k][u >> 5] >> (Mask - (u & Mask))) & 1;
}
*/
/** Adauga-l pe "v" la lista de adiacenta a lui "u". **/
void addEdge(int u, int v, int k, int pos) {
  l[pos].v = v;
  l[pos].k = k;
  l[pos].next = adj[u];
  adj[u] = pos;
}

/** Parcurge recursiv graful, cu capacitatea "mid". **/
void dfs(int u) {
  int pos;
  if (!seen[mid][u]) {
    seen[mid][u] = 1;
    for (pos = adj[u]; pos; pos = l[pos].next) {
      if (mid >= l[pos].k) {
        dfs(l[pos].v);
      }
    }
  }
}

/** Determina daca putem ajunge in "Y" cu capacitatea "mid". **/
void step(int lo, int hi) {
  mid = (lo + hi) >> 1;
  dfs(X);
}

/** Cauta binar capacitatea minima. **/
int bSearch(int lo, int hi) {
  while (lo <= hi) {
    step(lo, hi);
    if (seen[mid][Y]) {
      hi = mid - 1;
    } else {
      lo = mid + 1;
    }
  }
  return lo;
}

int main(void) {
  int i, u, v, k, max = 1;
  FILE *f = fopen("pscnv.in", "r");

  fread(buff, 1, Dragoste, f);
  freef(f, "%d %d %d", &N, &M, &X);
  read(f, &Y);
  for (i = 1; i <= M; i++) {
    freef(f, "%d %d %d", &u, &v, &k);
    addEdge(u, v, k, i);
    if (k > max) {
      max = k;
    }
  }
  fclose(f);

  f = fopen("pscnv.out", "w");
  fprintf(f, "%d\n", bSearch(1, max + 1));
  fclose(f);

  /** Multumim Doamne! **/
  puts("Doamne ajuta!");
  return 0;
}