void deletes(int n) { struct node *par = 0; temp = root; par = find_pos(n, root); if(temp -> data == n) { if( par -> left == temp){ if(temp -> right == 0) par ->left = temp -> left; else if(temp -> left == 0) par ->left = temp -> right; else { del_min(); } } else if(par -> right == temp) { if(temp -> right == 0) par ->right = temp -> left; else if(temp -> left == 0) par ->right = temp -> right; else { del_min(); } } else { printf("root changed\n"); if(root -> right == 0) root = root -> left; else del_min(); } } bf(par); }
struct elem * del_min(struct elem *const e) { struct elem *tmp, *_e; if (!e) return NULL; _e = e; if (e->left) e->left = del_min(e->left); else { if (!(tmp = e->right)) tmp = e, _e = NULL; else *_e = *tmp; /* free(tmp); */ } return post_del(_e); }
void print_min_pq(min_pq m, char *(to_string)(void *p), char *s) { min_pq temp = malloc(sizeof(m)); temp->num = m->num; temp->items = malloc(sizeof(void *) * (temp->num + 1)); int i; temp->compare = m->compare; for (i = 1; i < m->num + 1; i++) { SOCKET_BUNDLE bar = malloc(sizeof(SOCKET_BUNDLE)); bar = m->items[i]; //printf("%d\n", bar->num); temp->items[i] = m->items[i]; } printf("\n***************printing %s priority queue****************\n", s); while (temp->num > 0) { item t = del_min(temp); to_string(t); } printf("*********************************************************\n\n"); }
int main(int argc, char *argv[]) { unsigned int T; size_t i, V, E, a, b, A, B, w; int64_t l, alt; struct vertex heap_elem, min; const struct pt *ptr; scanf("%u", &T); while (T--) { init(); scanf("%zu%zu", &V, &E); for (i = 0; i < E; ++i) scanf("%zu%zu%ld", &a, &b, &l), pts[ne].v = b, pts[ne].l = l, pts[ne].next = adj[a], adj[a] = &pts[ne++], dist[a] = INF, dist[b] = INF; scanf("%zu%zu", &A, &B), dist[A] = 0, dist[B] = INF; ins((heap_elem.v = A, heap_elem.dist = 0, heap_elem)); while (heap_size) { min = del_min(); for (ptr = adj[min.v]; ptr; ptr = ptr -> next) if ((alt = dist[min.v] + ptr -> l) < dist[w = ptr -> v]) dist[w] = alt, ins((heap_elem.v = w, heap_elem.dist = alt, heap_elem)); } if (INF == dist[B]) printf("NO\n"); else printf("%ld\n", dist[B]); } return 0; }