📜  门|门CS 2013 |问题 24(1)

📅  最后修改于: 2023-12-03 15:42:22.907000             🧑  作者: Mango

题目介绍

本题为“门|门CS 2013”比赛中第24题,是一道经典的图论算法题目。本题的目标是统计一个有向无环图中所有长度为3的环的个数。

解题思路

本题可以用经典的Floyd-Warshall算法来解决。由于输入的图是一个有向无环图,所以不存在负环,因此采用Floyd-Warshall算法的时间复杂度为O(n^3)。

对于每个点对(i,j),用Floyd-Warshall算法求出从i到j的所有路径长度。对于任意三个点(i,j,k),如果存在i到j的路径长度为1,j到k的路径长度为1,i到k的路径长度为2,则说明存在一个长度为3的环。

具体实现时,可以使用一个二维数组dist[i][j]来存储从i到j的最短路径长度。初始化时,将dist[i][j]设为输入中i到j的距离,如果i和j之间没有边,则设dist[i][j]为无穷大。然后进行$n^3$次的循环,更新dist[i][j],如果dist[i][j]+dist[j][k]==2,则说明存在长度为3的环。最后统计所有长度为3的环的个数即可。

代码实现

以下为Python代码实现:

n = int(input())
dist = [[float('inf')] * n for _ in range(n)]
for i in range(n):
    row = input().strip()
    for j in range(n):
        if row[j] == '1':
            dist[i][j] = 1
    dist[i][i] = 0
for k in range(n):
    for i in range(n):
        for j in range(n):
            if dist[i][k] + dist[k][j] == 2:
                count += 1
print(count)

以上代码首先读入输入的有向无环图,然后使用Floyd-Warshall算法计算每个点对之间的最短路径长度,并统计长度为3的环的个数。