#!/usr/bin/python3 # === wej === n = int(input()) def read_graph(): G = [] for i in range(n+1): G.append([]) m = int(input()) for i in range(m): a, b = input().split() a, b = int(a), int(b) G[a].append(b) G[b].append(a) return G G1 = read_graph() G2 = read_graph() # === prog === edges = None def edge(a, b): return tuple(sorted([a, b])) # e = [a, b] # e.sort() # return tuple(e) moves = None def add(a, b): edges.add(edge(a, b)) moves.append((True, a, b)) def remove(a, b): edges.remove(edge(a, b)) moves.append((False, a, b)) def in_edges(a, b): return edge(a, b) in edges G = None vis = None def dfs(v): if v != 1: if not in_edges(v, 1): add(v, 1) vis[v] = 1 # print(f"-> {v}") for u in G[v]: if not vis[u]: dfs(u) elif vis[u] == 1: if u != 1: remove(v, u) elif vis[u] == 2: pass else: assert(False) vis[v] = 2 # print(f"<- {v}") def standarize(G_): global moves global G global vis global edges moves = [] G = G_ vis = [0] * (n+1) edges = set() for v in range(1, n+1): for u in G[v]: edges.add(edge(v, u)) # print(G) dfs(1) # dfs(2) # print(moves) return moves moves1 = standarize(G1) moves2 = list(reversed(standarize(G2))) # === wyj === print(len(moves1) + len(moves2)) for op, a, b in moves1: print(f"{'+' if op else '-'} {a} {b}") for op, a, b in moves2: print(f"{'-' if op else '+'} {a} {b}")
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | #!/usr/bin/python3 # === wej === n = int(input()) def read_graph(): G = [] for i in range(n+1): G.append([]) m = int(input()) for i in range(m): a, b = input().split() a, b = int(a), int(b) G[a].append(b) G[b].append(a) return G G1 = read_graph() G2 = read_graph() # === prog === edges = None def edge(a, b): return tuple(sorted([a, b])) # e = [a, b] # e.sort() # return tuple(e) moves = None def add(a, b): edges.add(edge(a, b)) moves.append((True, a, b)) def remove(a, b): edges.remove(edge(a, b)) moves.append((False, a, b)) def in_edges(a, b): return edge(a, b) in edges G = None vis = None def dfs(v): if v != 1: if not in_edges(v, 1): add(v, 1) vis[v] = 1 # print(f"-> {v}") for u in G[v]: if not vis[u]: dfs(u) elif vis[u] == 1: if u != 1: remove(v, u) elif vis[u] == 2: pass else: assert(False) vis[v] = 2 # print(f"<- {v}") def standarize(G_): global moves global G global vis global edges moves = [] G = G_ vis = [0] * (n+1) edges = set() for v in range(1, n+1): for u in G[v]: edges.add(edge(v, u)) # print(G) dfs(1) # dfs(2) # print(moves) return moves moves1 = standarize(G1) moves2 = list(reversed(standarize(G2))) # === wyj === print(len(moves1) + len(moves2)) for op, a, b in moves1: print(f"{'+' if op else '-'} {a} {b}") for op, a, b in moves2: print(f"{'-' if op else '+'} {a} {b}") |