Задать вопрос
@Rushpil

Найти ошибку в коде?

Задача: В первой строке вводится число N - номера связанных точек(т.е. из любой одной точки можно попасть в любую другую от 0 до N-1). Далее программа получает на вход порцию данных,каждая порция находится в отдельной строке.Первая порция-доступна сразу. А каждая следующая будет доступна тогда,когда наша программа выведет 'WAIT' или 'ATTACK' и выполнит flush. В каждой порции данных первым передается число R-количество пар(связей между вершинами).После него через пробел идут пары чисел, связи между точками(пары означают,что точки между собой связаны).После получения каждой порции данных надо вывести 'WAIT' -если пути от 0 до 9999 точки нету и продолжать ввод порций данных или "ATTACK"-если путь существует,после "ATTACK" программа завершает работу. Подскажите,что не так в моей программе ? Буду рад любому совету.Возможно поиск связи между точками можно осуществить по алгоритму DSU(метод не пересекающихся множеств), но у меня не получилось.

N=int(input())
b=N+1
k=[]
for i in range(1,b):
    k.append([int(i-1),int(i)])
def func(k):
   p=list(map(int,input().split()))
   for i in range(2,len(p),2):
      k.append([p[i-1],p[i]])
   ribsDict = dict()         #Заводим словарь
   for i in range(10000):        #Пробегаем по всем вершинам
        connectRibs = []         #заводим список
        for j in range(len(k)):#Проходим по всем ребрам
            if k[j][0] == i + 1:#Проверяем граф на связность,ищем,
                connectRibs.append(k[j][1])#с какой вершиной связана каждая из вершин
            elif k[j][1] == i + 1:#
                connectRibs.append(k[j][0])#
        ribsDict[i + 1] = connectRibs
   z=[]
   for k, v in ribsDict.items():
      z.append(v)
 
   visited = [False] * 10000
   component = [-1] * 10000  # для каждой вершины храним номер её компоненты
   num_components = 0
 
   def dfs(v):
       component[v] = num_components
       visited[v] = True
       for w in z[v]:
           if visited[w] == False:
               dfs(w)
 
   visited = [False] * 10000
   for v in range(10000):
       if not visited[v]:
           dfs(v)
           num_components += 1
   w=9999
   v=0
   if component[v]==component[w]:
      print('ATTACK')
   else:
      print('WAIT')
      func(k)
   stdout.flush()
func(k)
  • Вопрос задан
  • 190 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
longclaps
@longclaps
Возможно поиск связи между точками можно осуществить по алгоритму DSU(метод не пересекающихся множеств), но у меня не получилось.

Ага. Упорства вам не занимать, но ваш код прямиком идёт на помойку.
N = 5
data = (
    ((0, 1),),
    ((1, 2), (3, 2)),
    ((4, 3),),
    ((1, 3), (4, 2))
)
root = list(range(N))


def chain_root(a):
    res = []
    while a != root[a]:
        res.append(a)
        a = root[a]
    return res, a


for pairs in data:
    for a, b in pairs:
        aa, ra = chain_root(a)
        bb, rb = chain_root(b)
        if ra > rb:
            ra, rb = rb, ra
        for node in [*aa, *bb, rb]:
            root[node] = ra
    aa, ra = chain_root(N - 1)
    if ra:
        for node in aa:
            root[node] = ra
        print('WAIT')
    else:
        print('ATTACK')
        break

Подучите питон - он у вас пока ниже плинтуса. И да - как успехи в предыдущей задаче?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
aRegius
@aRegius
Python Enthusiast
Подскажите,что не так в моей программе ?

Проверьте на предмет переопределения переменной k вот в этом месте:
for k, v in ribsDict.items()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы