C中顶点的三角形数

时间:2017-07-03 17:41:31

标签: c graph adjacency-list

我在开发一个函数来计算Graph的每个顶点中的三角形数量时遇到了一些困难。该图是邻接列表。我做到了 如果V1和V2之间有边缘,则返回1的Is_Edge函数,这可能会有所帮助。任何提示?结构如下:

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);
    }
}

1 个答案:

答案 0 :(得分:0)

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

如果你知道边缘连接了哪些顶点,比如你有一个函数Connected(i, j),顶点总数N,那么你可以计算共享顶点的三角形的数量{{1使用(伪代码)

k

但是,上述功能根本不使用邻接列表。

假设您确实拥有顶点Function triangles_at_vertex(k): Count = 0 For i = 1 to N: If i != k AND Connected(i, k): For j = 1 to N: If j != i AND j != k AND Connected(i, j): Count = Count + 1 End if End For End If End For Return Count End Function 的邻接列表,以及与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 可以是列表,有序集(对数组)或无序集。请注意,它不能包含与顶点pairs的邻接列表一样多的成员,因为我们要查找的所有三角形中的所有顶点必须位于k的邻接列表中。

如果我们假设所有邻接列表都已完成,我们可以避免使用k集合/列表 - 在pairs的邻接列表中列出k的意义上,然后i列在i的邻接列表中。通常,只存储邻接的一半,以减少内存使用。

然后,我们知道我们将每对配对两次,因为我们同时计算ki,j

j,i

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