n = int(input()) graf1 = [[] for i in range(n)] graf2 = [[] for i in range(n)] relacje = {} relacje_pierwszego = {} dzialania_poczatek = [] dzialania_srodek = [] dzialania_koniec = [] DO_USUNIECIA = 0 #JEST_OK = 1 DO_DODANIA = 2 moves = [] m = int(input()) for _ in range(m): a, b = map(int, input().split()) a, b = (a-1, b-1) if a < b else (b-1, a-1) graf1[a].append(b) graf1[b].append(a) if a: relacje[(a, b)] = DO_USUNIECIA #print(graf1) m = int(input()) for _ in range(m): a, b = map(int, input().split()) a, b = (a-1, b-1) if a < b else (b-1, a-1) graf2[a].append(b) graf2[b].append(a) if not a: relacje_pierwszego[b] = 1 else: if (a, b) in relacje: #relacje[(a, b)] = JEST_OK del relacje[(a, b)] else: relacje[(a, b)] = DO_DODANIA #print(graf2) for k, v in relacje.items(): if v == DO_DODANIA: dzialania_srodek.append("+ " + str(k[0]+1) + " " + str(k[1]+1)) elif v == DO_USUNIECIA: dzialania_srodek.append("- " + str(k[0]+1) + " " + str(k[1]+1)) #print(k, v) #print(relacje) del relacje # bfs queue = graf1[0] visited = [0 for i in range(n)] visited[0] = 1 for i in queue: visited[i] = 1 while queue: new = [] for i in queue: for j in graf1[i]: if not visited[j]: dzialania_poczatek.append("+ 1 " + str(j+1)) visited[j] = 1 new.append(j) #print(new) queue = new del queue del visited del graf1 # bfs queue = graf2[0] visited = [0 for i in range(n)] visited[0] = 1 for i in queue: visited[i] = 1 while queue: new = [] for i in queue: for j in graf2[i]: if not visited[j]: if j not in relacje_pierwszego: dzialania_koniec.append("- 1 " + str(j+1)) visited[j] = 1 new.append(j) #print(new) queue = new del queue del visited del graf2 del relacje_pierwszego dzialania_koniec.reverse() moves = dzialania_poczatek + dzialania_srodek + dzialania_koniec print(len(moves)) print("\n".join(moves))
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 97 98 99 100 101 102 103 104 105 106 | n = int(input()) graf1 = [[] for i in range(n)] graf2 = [[] for i in range(n)] relacje = {} relacje_pierwszego = {} dzialania_poczatek = [] dzialania_srodek = [] dzialania_koniec = [] DO_USUNIECIA = 0 #JEST_OK = 1 DO_DODANIA = 2 moves = [] m = int(input()) for _ in range(m): a, b = map(int, input().split()) a, b = (a-1, b-1) if a < b else (b-1, a-1) graf1[a].append(b) graf1[b].append(a) if a: relacje[(a, b)] = DO_USUNIECIA #print(graf1) m = int(input()) for _ in range(m): a, b = map(int, input().split()) a, b = (a-1, b-1) if a < b else (b-1, a-1) graf2[a].append(b) graf2[b].append(a) if not a: relacje_pierwszego[b] = 1 else: if (a, b) in relacje: #relacje[(a, b)] = JEST_OK del relacje[(a, b)] else: relacje[(a, b)] = DO_DODANIA #print(graf2) for k, v in relacje.items(): if v == DO_DODANIA: dzialania_srodek.append("+ " + str(k[0]+1) + " " + str(k[1]+1)) elif v == DO_USUNIECIA: dzialania_srodek.append("- " + str(k[0]+1) + " " + str(k[1]+1)) #print(k, v) #print(relacje) del relacje # bfs queue = graf1[0] visited = [0 for i in range(n)] visited[0] = 1 for i in queue: visited[i] = 1 while queue: new = [] for i in queue: for j in graf1[i]: if not visited[j]: dzialania_poczatek.append("+ 1 " + str(j+1)) visited[j] = 1 new.append(j) #print(new) queue = new del queue del visited del graf1 # bfs queue = graf2[0] visited = [0 for i in range(n)] visited[0] = 1 for i in queue: visited[i] = 1 while queue: new = [] for i in queue: for j in graf2[i]: if not visited[j]: if j not in relacje_pierwszego: dzialania_koniec.append("- 1 " + str(j+1)) visited[j] = 1 new.append(j) #print(new) queue = new del queue del visited del graf2 del relacje_pierwszego dzialania_koniec.reverse() moves = dzialania_poczatek + dzialania_srodek + dzialania_koniec print(len(moves)) print("\n".join(moves)) |