C中顶点中的三角形数

C中顶点中的三角形数,c,graph,adjacency-list,C,Graph,Adjacency List,我很难开发一个函数来计算图中每个顶点的三角形数。此图是一个邻接列表。我做的 Is_Edge函数返回1,如果V1和V2之间有一条边,这可能会有所帮助。有什么提示吗?结构如下: struct AdjListNode { int dest; int TrianglesNumber; int weight; struct AdjListNode* next; }; struct AdjList { struct AdjListNode *head; }; s

我很难开发一个函数来计算图中每个顶点的三角形数。此图是一个邻接列表。我做的 Is_Edge函数返回1,如果V1和V2之间有一条边,这可能会有所帮助。有什么提示吗?结构如下:

struct AdjListNode
{
    int dest;
    int TrianglesNumber;
    int weight;
    struct AdjListNode* next;
};

struct AdjList
{
    struct AdjListNode *head; 
};

struct Graph
{
    int V;
    struct AdjList* array;
};

int Is_Edge(struct Graph *Graph,int V1,int V2){
    int find=0;
    if(V1 > Graph->V || V2 > Graph->V)
        return 0;
    else{
        struct AdjListNode *aux = Graph->array[V1].head;
        while((aux!=NULL)&&(!find)){
                if(aux->dest == V2)
                    find = 1;
                else
                    aux = aux->prox;
        }
        return(find);
    }
}

在知道希望代码实现什么逻辑或算法之前,不要编写代码

如果您知道哪些顶点由边连接,例如您有一个函数
连接(i,j)
,以及顶点总数
N
,则可以使用(伪代码)计算共享顶点
k
的三角形数

但是,上述函数根本不使用邻接列表


假设您有顶点
k
的邻接列表,以及与
k
相邻的所有顶点的邻接列表。计算三角形的一种方法是计算也连接到顶点的唯一连接顶点对的数量
k

Function triangles_at_vertex(k):
    pairs = Empty
    kList = Adjacency_list(k)
    For i in kList:
       iList = Adjacency_list(i)
       For j in iList:
           If (j in kList):
               If ((Pair(i,j) NOT in pairs) AND
                  ((Pair(j,i) NOT in pairs):
                   Add Pair(i, j) to pairs
               End If
           End If
       End For
    End For
    Return Count(pairs)
End Function
上面的
对可以是列表、有序集(对数组)或无序集。请注意,它的成员不能像顶点
k
的邻接列表那样多,因为我们要查找的所有三角形中的所有顶点都必须在
k
的邻接列表中


我们可以避免
集合/列表,如果我们假设所有的邻接列表都是完整的——即如果
k
列在
i
的邻接列表中,那么
i
也列在
k
的邻接列表中。通常,仅存储邻接的一半,以减少内存使用

然后,我们知道我们精确地计算每一对两次,因为我们同时计算
i,j
j,i

Function triangles_at_vertex(k):
    Count = 0
    kList = Adjacency_list(k)
    For i in kList:
       iList = Adjacency_list(i)
       For j in iList:
           If (j in kList):
               Count = Count + 1
           End If
       End For
    End For
    Return Count / 2
End Function


首先选择您的算法,然后开始编码。

我认为您将“三角形”定义为没有任何自边的三边循环。你可以用各种方法解决这个问题;一种是基于邻接列表的有界深度优先搜索。也就是说,探索从相关顶点开始的三条边路径,并计算有多少条边路径在该顶点结束。您的数据结构显示一个有向图;如果它是无向的,那么你可能需要除以2来说明你可以穿过每个三角形的两个不同方向。谢谢你的建议,我会考虑它们。@Jessy:我个人写了很多非常小的测试程序,只是为了看看一个试探性的想法在实践中会是什么样子。通常情况下,我只实现最难的部分(那些我没有实现足够多的时间来知道什么适合我所想的那种情况)。我将它们保存在一个目录结构中,每个代码段一个目录(用数字和最小长度描述命名),目录中有一个巨大的注释(或文本文件)来描述问题和我的想法。这些方法非常方便,因此建议尝试类似的方法。
Function triangles_at_vertex(k):
    Count = 0
    kList = Adjacency_list(k)
    For i in kList:
       iList = Adjacency_list(i)
       For j in iList:
           If (j in kList):
               Count = Count + 1
           End If
       End For
    End For
    Return Count / 2
End Function