前四个问题,答案正确,后面卡UNION大小的,显示非零返回,目前找不到问题所在。以下代码仅供参考:
class Nodes:
def __init__(self,data, parent):
self.data = data
self.parent = parent
#并操作
def Union(Arr,Root1, Root2):
if Arr[Root2].parent<Arr[Root1].parent:
Arr[Root1].parent = Root2
elif Arr[Root1].parent == Arr[Root2].parent:
Arr[Root1].parent-=1
Arr[Root2].parent = Root1
#查操作
def Find(Arr,num):
#返回的是数组的下标而不是Nodes的性质
while(Arr[num].parent>=0):
num = Arr[num].parent
return num
def Input_Connection(Arr,num1, num2):
Root1 = Find(Arr,num1-1)
Root2 = Find(Arr,num2-1)
if (Root1!=Root2):
Union(Arr, Root1, Root2)
def Check_Connection(Arr, num1, num2):
Root1 = Find(Arr, num1 - 1)
Root2 = Find(Arr, num2 - 1)
if (Root1 == Root2):
print("yes")
else:
print("no")
def Check_Network(Arr, n):
counter = 0
for i in range(n):
if Arr[i-1].parent <0:
counter += 1
if counter == 1:
print("The network is connected!")
else:
print("There are %d components."%counter)
def main():
n = int(input())
#Nodes装进数组
Arr = [None]*n
for i in range(n):
Arr[i] = Nodes(i+1, -1)
while True:
List = list(input().split())
if List[0] == 'I':
num1 = ord(List[1]) - ord('0')
num2 = ord(List[2]) - ord('0')
Input_Connection(Arr,num1, num2)
elif List[0] == 'C':
num1 = ord(List[1]) - ord('0')
num2 = ord(List[2]) - ord('0')
Check_Connection(Arr, num1, num2)
elif List[0] == 'S':
Check_Network(Arr, n)
break
return 0
if __name__ =="__main__":
main()