我试图用以下代码解决这个问题。但所有输入的答案都不准确。
问题陈述
Byteland有N个城市和N个单向桥梁。只有一个传入和一个传出 每个城市的桥梁。 Byteland希望“有资格”主办世界杯。一个国家对世界“有资格” 杯,当且仅当您可以从任何城市旅行到该国的任何其他城市。你被要求表演 帮助Byteland成为世界杯主办方的最低步数。 对于每个步骤,您可以交换两个桥的目的地。
例如:我们有两座桥梁A - > B和 C - > D(从A到B以及从C到D的桥)。如果我们交换他们的目的地,我们将有两个 桥A - >; D和C - > B。
输入格式
第一行包含一个整数,T表示测试用例的数量。 对于每个测试,将有两行: 第一行包含一个整数N. 第二行包含N个整数,其中第X个整数表示桥从城市X出发的城市。
输出格式
只需打印问题的答案,每个案例一行。
示例输入
2
4
3 1 2 4
3
2 3 1
示例输出
1
0
我的代码
for i in range(input()):
n = input()
bridges = {}
connection = [int(y) for y in raw_input().split(' ')]
for j in range(n):
bridges[j+1] = connection[j]
#print bridges
count = 0
swapped = True
for k in range(1, n+1):
if swapped:
swapped = False
for j in range(1, n+1):
if bridges[bridges[j]] == j:
bridges[j], bridges[1 if (j+1)%n == 0 else (j+1)%n] = bridges[1 if (j+1)%n == 0 else (j+1)%n], bridges[j]
swapped = True
#print bridges
count += 1
print count
答案 0 :(得分:2)
您必须计算连接的组件,然后交换次数等于组件数减1。
for i in range(int(input())):
N = int(input())
bridges = {index + 1: int(connection) for index, connection in enumerate(input().split())}
visited = set()
component_count = 0
towns = list(bridges.keys())
while towns:
current = towns[0]
component = set()
while current not in visited:
towns.remove(current)
visited.add(current)
current = bridges[current]
component_count += 1
print(component_count - 1)
代码执行以下操作:
这给出了正确的结果,因为我们保证组件是循环,您可以打破循环(交换连接)以将组件连接到另一个组件而不会破坏组件。