有人可以告诉我,为了构建具有适当节点和链接的图表,我必须使用哪种邻接列表?我必须创建一个树结构来定义ajdacency列表?或者还有另一种方式吗?
现在对矩阵不感兴趣,谢谢。
nodes {a,b,c}, connection {{a-c},{b,c}}
所以我有和arraylist或我的邻接列表[a[c],b[c],c[a,b]]
答案 0 :(得分:2)
邻接列表仅表示哪些节点彼此连接。
如果您的图形具有以下节点1-4,则相邻矩阵将如下所示。 “1”表示节点之间的连接。
1 2 3 4
1 1 1 1 1
2 1 0 0 0
3 0 1 0 1
4 0 1 1 0
,列表看起来像这样。 - >代表链接
1 -> 1 -> 2 -> 3 -> 4
2 -> 1
3 -> 2 -> 4
4 -> 2 -> 3
你有没有在上面指定的数组中使用链表,所以数组将包含节点1 - 4.然后你可以有一个成员变量表示与另一个节点的连接或在每个元素中有一个单独的数组列表数组。
答案 1 :(得分:0)
ArrayLists的ArrayList(或更一般地说,列表列表)是一个很好的方法,是的。它是邻接列表的标准代表。所以你的想法很好。
另外,如果您事先知道图形的大小(节点数),并且在创建之后不需要向其添加节点,那么ArrayLists数组也会有效并且效率更高。
答案 2 :(得分:0)
您可以使用Dictionary
实现邻接列表。字典中的每个键都代表边缘的起始节点。每个值都是List
个对象,每个对象定义边缘的目标节点。
例如,您可以在每个密钥中存储List
Tuples
。 Tuple
中的第一项表示目标节点。其他项目将定义边缘的属性。
class AdjacencyList
{
Dictionary<int, List<Tuple<int, int>>> adjacencyList;
// Constructor - creates an empty Adjacency List
public AdjacencyList(int vertices)
{
adjacencyList = new Dictionary<int, List<Tuple<int, int>>>();
}
// Appends a new Edge to the linked list
public void addEdge(int startVertex, int endVertex, int weight)
{
if (!adjacencyList.ContainsKey(startVertex)) {
adjacencyList[startVertex] = new List<Tuple<int, int>>();
}
adjacencyList[startVertex].Add(new Tuple<int, int>(endVertex, weight));
}
// Removes the first occurence of an edge and returns true
// if there was any change in the collection, else false
public bool removeEdge(int startVertex, int endVertex, int weight)
{
Tuple<int, int> edge = new Tuple<int, int>(endVertex, weight);
return adjacencyList[startVertex].Remove(edge);
}
}