我在开发一个函数来计算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);
}
}
答案 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
的邻接列表中。通常,只存储邻接的一半,以减少内存使用。
然后,我们知道我们将每对配对两次,因为我们同时计算k
和i,j
:
j,i
首先选择算法,然后开始编码。