如何计算要更改的边数以使无向图成为单个组件?

时间:2015-09-12 11:12:01

标签: python graph dynamic-programming graph-algorithm

我试图用以下代码解决这个问题。但所有输入的答案都不准确。

问题陈述

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

1 个答案:

答案 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)

代码执行以下操作:

  • 从尚未参观的第一个城镇(外环)开始,尽可能多地参观城镇连接(内环)
  • 每次内部循环中断时,意味着我们遇到了一个我们已经遇到过的城镇,它在图表中构成了一个组件。
  • 打破循环并增加组件数量。重新开始使用未访问的新twon

这给出了正确的结果,因为我们保证组件是循环,您可以打破循环(交换连接)以将组件连接到另一个组件而不会破坏组件。