给出邻接关系,如
3 - > 4
1→ 3
等。
如何构建它的图形。我想要一个初学者可以理解的更简单的实现。我知道自我参照结构。请帮忙
答案 0 :(得分:4)
为什么不使用 Adjacency Matrix ,这非常简单易行。
邻接矩阵是定义图的顶点之间关系的矩阵。
在上面的示例中,您有一个从顶点1
到2
的边,因此在邻接矩阵的索引1
处有一个[1][2]
,类似是[1][3]
等等的情况。
而且您从1
到5
没有任何优势,因此索引0
有[1][5]
,依此类推。
你也可以使用 Adjacency List ,现在继续谷歌以了解如何使用邻接矩阵和邻接列表,然后回过头来解决一些真正的问题。< / p>
修改强>
我知道,您对如何实施图表一无所知,让我使用邻接矩阵为您编写一些示例。
我假设您知道如何在c ++中分配2D数组。
现在,如果要为包含n
个顶点的图形创建邻接矩阵,只需创建一个大小为n x n
的2D数组,并使用0
初始化其中的所有元素
int** createAdjacencyMatrix(int n){
int** graph = new int*[n];
for (int i = 0; i < n; i++){
graph[i] = new int[n];
for (int j = 0; j < n; j++){
graph[i][j] = 0;
}
}
return graph;
}
你去,打电话给这个功能,你自己创建了一个邻接矩阵。
int** graph = createAdjacencyMatrix(5);
现在,您可以对图表执行任何操作(目前,它没有任何边缘)。
要在其中加上边,只需将1
放在想放边的位置即可。
void putEdge(int** graph, int startFrom, int endAt, int totalVertices){
if (startFrom >= 1 && startFrom <= totalVertices && endAt >= 1 && endAt <= totalVertices){
graph[startFrom - 1][endAt - 1] = 1; // Because c++ uses 0 based indexing, so 1 will be stored at 0, 2 at 1 and so on.
}
}
现在,只需调用此函数,并在图形中添加一些边。 所以我要设置一些边缘并在其中创建上面显示的图形。
putEdge(graph, 1, 2, 5);
putEdge(graph, 1, 3, 5);
putEdge(graph, 1, 4, 5);
putEdge(graph, 2, 3, 5);
putEdge(graph, 3, 2, 5);
putEdge(graph, 5, 2, 5);
putEdge(graph, 4, 4, 5);
现在,你可以用你的图表做任何你想做的事情,比如我们应该计算出vertex 1
有多少外向边?
为此,您可以简单地遍历第1行
int noOfOutgoingEdges(int** graph, int vetex, int totalVertices){
if (vertex < 1 || vertex > totalVertices)
return -1;
int count = 0;
for (int i = 0; i < totalVertices; i++){
if (graph[vertex - 1][i] == 1)
count++;
}
return count;
}
最后,您应该为邻接图解除分配的内存。
void deallocateGraph(int** graph, int totalVertices){
for (int i = 0; i < totalVertices; i++)
delete[] graph[i];
delete[] graph;
}
所以,我认为,到目前为止,您已经有了更好的理解。
我只使用函数实现了图形,并将邻接矩阵传递给它们(我的坏),我强烈建议在一个类中实现Graph,它可以处理所有的Graph本身,而你不必将邻接矩阵传递给它,您甚至不必知道Graph类是使用Adjacency Matrix还是其他方法实现的(当然在使用类时,不实现它)
你的课应该是这样的:
class Graph{
int** adjMatrix;
int totalVertices;
public:
Graph(int totalVertices);
void putEdge(int startFrom, int endAt);
int noOfOutgoingEdges(int vertex);
int noOfIncomingEdges(int vertex);
~Graph();
};
现在,继续实现这个类,并在那里添加你想要的任何函数。
答案 1 :(得分:0)
使用适当的抽象级别。您想将每个节点表示为带有一组neightbours的int吗?
map<int, set<int>> neighbours {
{ 1, { 2, 3, 4} },
{ 2, { 3 }},
{ 3, { 2 }},
{ 4, { 4 }},
{ 5, { 2 }}
};