def triangleCount(graph): count = 0 tringle = [] for srcId in graph: srcSet = graph.get(srcId) for destId in srcSet: if (destId > srcId): destSet = graph.get(destId) for vertexId in destSet: if(vertexId in srcSet) and (vertexId > destId): count += 1 tringle.append((srcId, destId, vertexId)) print("===================================") print("Triangle Count: ", count) print(tringle) if __name__ == "__main__": #directed graph graph = {0: [1, 2], 1: [2, 3], 2: [3], 3: []} #undirected graph graph = {0: [1, 2], 1: [0, 2, 3], 2: [0, 1, 3], 3: [1, 2]} triangleCount(graph)
现在不用我多说,大家也都猜到了出现在A和相同位置中的非零值,就表示可以形成三角形,而非零值的个数即为Triangle Count。用公式表示为:
其邻接矩阵A和 分别是:
则可得,from numpy.random import rand import numpy as np def init(dimension): mat = np.zeros((dimension, dimension)) mat[(rand(dimension) * dimension).astype(int), (rand(dimension) * dimension).astype(int)] = 1 return mat def triangleCount(adjacencyMat): biAdjacencyMat = np.dot(adjacencyMat, adjacencyMat) countIntersect = np.logical_and(adjacencyMat, biAdjacencyMat) return countIntersect if __name__ == "__main__": adjacencyMat = np.array([[0, 1, 1, 0], [0, 0, 1, 1], [0, 0, 0, 1], [0, 0, 0, 0]]) dimension = 4 adjacencyMat1 = init(dimension) print(triangleCount(adjacencyMat))