如何在图中找到“朋友三角”?

Posted

技术标签:

【中文标题】如何在图中找到“朋友三角”?【英文标题】:How to find a "triangle of friends" in a graph? 【发布时间】:2021-10-15 20:19:36 【问题描述】:

我有朋友的名字,我正在寻找朋友的三角形,如果有的话。 示例(相邻的名字归类为朋友,第一行第一个数字代表人数,第二个数字代表友谊数):

6 7
mirko slavko
slavko janko
janko mirko
slavko luka
luka mirjana
mirjana ivana
ivana luka

在这个例子中,janko - mirko - slavko 是一个三角形,mirjana - luka - ivana 是另一个三角形。

我写了一个代码来生成一个代表这个图的二维列表。

L = [input().split() for i in range (n)]
H=[]
for i in range(n):
    for j in range(2):
        if L[i][j] not in H:
            H.append(L[i][j])
H.sort()

for number, name in enumerate(H):
    for i in range (n):
        for j in range(2):
            L[i][j]=L[i][j].replace(name, str(number))
        
    
matrix = [[0 for i in range(m)] for j in range(m)]

for i, j in L:
    matrix[int(i)][int(j)]=matrix[int(j)][int(i)]=1


图表是这样的(名字按字母顺序排列,每一行每一列代表一个名字,1代表存在友谊,0代表这两个人不是朋友):

[0, 0, 1, 1, 0, 0]  
[0, 0, 0, 0, 1, 1]  
[1, 0, 0, 1, 0, 1]  
[1, 0, 1, 0, 0, 0]  
[0, 1, 0, 0, 0, 1]  
[0, 1, 1, 0, 1, 0]  

我的问题是如何用代码找到三角形??

【问题讨论】:

你可能想使用networkx图论库。 看起来蛮力搜索可能是最佳选择。 en.wikipedia.org/wiki/Clique_problem 【参考方案1】:

clique problem 的大多数形式都是困难的,最一般的解决方案是 NP 完全的。因此 O(N**3) 可能是您可以做的最好的假设输入表示是有效的,并且由于您已经制作了 2d 矩阵,所以您大部分时间都在那里。

friends = [
     [0,1,1,0],
     [1,0,1,1],
     [1,1,0,0],
     [0,1,0,0]]
n = 4

for i in range(n):
    for j in range(i+1, n):
        if not friends[i][j]:
            continue
        for k in range(j+1, n):
            if friends[i][k] and friends[j][k]:
                print('friends!')
                print(i,j,k)

【讨论】:

【参考方案2】:

最简单的方法是

    创建一个字典,其键是人名,值是那个人的朋友集合。确保如果 A 在 B 的朋友集中,则 B 也在 A 的朋友集中。

    对于AB 的每一对人,查看friends[A].intersect(friends[B]) 是否为空。

【讨论】:

以上是关于如何在图中找到“朋友三角”?的主要内容,如果未能解决你的问题,请参考以下文章

在图中,如何找到一组节点最近的节点?

10,25,50,100,250,500,1000 如何找到要在图中绘制的序列方程

如何在图中找到这样的连接边对的最大数量,每对与另一对至少被两条边隔开?

在无向图中如何定义祖先和后代?

如何从哈希图中找到最高的键值

在图中找到最长的路径