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)) |
English