#include #include #include #include struct room_t { int from, dist, n_doors, doors[101], c_door; } room[1000]; int n_rooms = 0; queue room_dic[1000]; int make_room(int n_doors, int from, int dist) { room[n_rooms].from = from; room[n_rooms].dist = dist; room[n_rooms].n_doors = n_doors; room[n_rooms].c_door = 0; room_dic[dist].push(n_rooms); return n_rooms++; } bool can_make_route(int src) { return room[src].c_door < room[src].n_doors; } bool make_route(int src, int dst) { if(room[dst].c_door >= room[dst].n_doors) return false; room[src].doors[room[src].c_door++] = dst; room[dst].doors[room[dst].c_door++] = src; return true; } int main(void) { ifstream fin("ninja.txt"); int nProblems; fin >> nProblems; while(nProblems-- > 0) { n_rooms = 0; for(int i = 0; i < 1000; i++) { while(!room_dic[i].empty()) room_dic[i].pop(); } int n, c_room = 0; fin >> n; c_room = make_room(n, -1, 0); if(n > 0) { while(fin >> n) { if(n > 0) { while(!can_make_route(c_room)) { c_room = room[c_room].from; } int new_room = make_room(n, c_room, room[c_room].dist + 1); make_route(c_room, new_room); c_room = new_room; } else if(n < 0) { while(!can_make_route(c_room)) { c_room = room[c_room].from; } int f_dist = room[c_room].dist + n; while(!make_route(c_room, room_dic[f_dist].front())) { room_dic[f_dist].pop(); } } else { break; } } for(int i = 0; i < n_rooms; i++) { cout << i + 1; sort(room[i].doors, room[i].doors + room[i].n_doors); for(int j = 0; j < room[i].n_doors; j++) { cout << " " << room[i].doors[j] + 1; } cout << endl; } } } }