logankeede's blog

By logankeede, history, 4 months ago, In English

I have already seen the tutorial and solved this question 2001C - Guess The Tree but I am still curious about what I did wrong in my original approach 277413780 because I feel that approach is correct, so if you can let me know my fault in approach or implementation, I will be grateful.

Thank You.

import sys
print = sys.stdout.write


t = int(input())
for i in range(t):
    n = int(input())
    child = []
    stack = []
    dic= [[0]*(n+1) for i in range(n+1)]
    for i in range(2,n+1):
        print(f"? {1} {i}\n")
        sys.stdout.flush()
        ans = int(input())
        if ans ==1:
            child.append((1,i))
        else:
            stack.append((1,ans,i))
        dic[i][1] = 1
        dic[1][i] = 1
    while stack:
        k = stack.pop()
        if dic[k[0]][k[1]] == 0 :
            print(f"? {k[0]} {k[1]}\n")
            sys.stdout.flush()
            ans = int(input())
            if ans == k[0]:
                child.append((k[0], k[1]))
            else:
                stack.append((k[0], ans, k[1]))
            dic[k[0]][k[1]] = 1
            dic[k[1]][k[0]] = 1
        if dic[k[2]][k[1]] == 0:
            print(f"? {k[1]} {k[2]}\n")
            sys.stdout.flush()
            ans = int(input())
            if ans == k[1]:
                child.append((k[1], k[2]))
            else:
                stack.append((k[1], ans, k[2]))
            dic[k[2]][k[1]] = 1
            dic[k[1]][k[2]] = 1
    print("! ")
    sys.stdout.flush()
    for a,b in child:
        print(f"{a} {b} ")
        sys.stdout.flush()
    print("\n")
    sys.stdout.flush()

Explaination:

dic matrix keeps track of what queries have already been made.

child keeps track of edges that have been found (some what misleading I know *_*).

stack keeps track of what queries have been made and their answer in format (a, answer, b) (if a and b are queries) and in turn what new queries need to be made.

the key difference from tutorial is after initial queries from 1 to {2 3 .... n} nodes I explore both sides of an answered query until I get an edge and keep track of it using dic and stack

  • Vote: I like it
  • +7
  • Vote: I do not like it