#include #include #define INF (2000000000); unsigned int node_cena[12000]; int node_sil[12000]; int node_final[12000]; int node_heap[12000]; struct sil { int z; int kam; int cena; int next; }; struct sil sil[60000]; int heap[52000]; int heap_alloc; void swap(int at1, int at2) { int x = heap[at1]; heap[at1] = heap[at2]; heap[at2] = x; node_heap[heap[at1]] = at1; node_heap[heap[at2]] = at2; } int CENA(int i) { if (i==0) return -10; if (i>heap_alloc) return INF; return node_cena[heap[i]]; } void fixdown(int i) { if (i <= 1) return; if (CENA(i) > CENA(i/2)) return; swap(i, i/2); fixdown(i/2); } #define MIN(a,b) (aheap_alloc) return; c1 = CENA(2*i); c2 = CENA(2*i+1); c = MIN(c1, c2); if (c < CENA(i)) { if (c1 == c) { swap(i, 2*i); fixup(2*i); } else { swap(i, 2*i+1); fixup(2*i+1); } } } void insert_heap(int node) { heap[++heap_alloc] = node; node_heap[node] = heap_alloc; fixdown(heap_alloc); } void delete_heap(int node) { int at = node_heap[node]; swap(heap_alloc, at); heap_alloc--; node_heap[node] = -1; fixup(at); fixdown(at); } void printheap(void) { int i; for (i=1; i<=heap_alloc; i++) { printf("%d,%d ", heap[i], CENA(i)); if (node_heap[heap[i]] != i) printf("!!!"); } printf("<- HEAP\n"); } #define printheap(); int main (int argc, char **argv) { char temp [65536]; while (1) { int N,M,S,C,i,j; scanf("%d %d %d %d\n", &N, &M, &S, &C); if (!N && !M && !S && !C) break; for (i=0; i %d (%d,%d)\n", sil[j].z, kam, node_cena[kam], sil[j].cena);*/ if (node_cena[kam] > node_cena[i] + sil[j].cena) { if (node_final[sil[j].kam]) { printf("BLEE!\n"); return 1; } node_cena[kam] = node_cena[i] + sil[j].cena; /* printf("Making better, %d cena %d\n", kam, node_cena[kam]);*/ if (node_heap[kam] != -1) { delete_heap(kam); } insert_heap(kam); printheap(); } j = sil[j].next; } } } return 0; }