如何将邻接矩阵转换为关联矩阵



我试图将邻接矩阵转换为无向图的关联矩阵。对于边缘:(1,2(,(1,5(,(1.6(,(2,3(,(2.5(,(3,4(,(5,5(

调整矩阵为:

0 1 0 0 1 1

10 1 0 1 0

0 1 0 1 1 0

0 0 1 0 1 0

1 1 1 0 1

1 0 0 0 1 0

我希望关联矩阵的结果是

0 1 0 0 1 1 0 0

1 0 0 1 0 0 0 0

0 1 0 1 1 0 0 0

0 0 1 0 1 0 0 0

1 1 1 1 0 1 0 0

1 0 0 1 0 0 0 0

但是,我的程序返回这个:

1 0 0 0 0

0 1 1 0 0 0 0

0 1 0 1 1 0 0 0

0 0 0 1 0 1 0 0

1 0 1 0 1 1 0 0

0 0 0 0

我的源代码:

graph constructor
Graph(int vertices, int edges)
{
this->vertices = vertices;
this->edges = edges;
edge = std::vector<Graph::Edge*>(edges);
for (int i = 0; i < edges; i++)
{
edge[i] = new Edge(this);
}
}
Graph* g = new Graph(numberOfVertices, numberOfEdges);
g->edge[0]->src = 1;
g->edge[0]->dest = 2;
g->edge[1]->src = 1;
g->edge[1]->dest = 5;
g->edge[2]->src = 1;
g->edge[2]->dest = 6;
g->edge[3]->src = 2;
g->edge[3]->dest = 3;
g->edge[4]->src = 2;
g->edge[4]->dest = 5;
g->edge[5]->src = 3;
g->edge[5]->dest = 4;
g->edge[6]->src = 3;
g->edge[6]->dest = 5;
g->edge[7]->src = 4;
g->edge[7]->dest = 5;
g->edge[8]->src = 5;
g->edge[8]->dest = 6;
for (i = 0; i < numberOfEdges; i++)
{
adjacency_matrix[g->edge[i]->src][g->edge[i]->dest] = 1;
adjacency_matrix[g->edge[i]->dest][g->edge[i]->src] = 1;
}
std::cout << "Adjacency matrix : " << std::endl;
for (i = 1; i <= numberOfVertices; i++)
{
for (j = 1; j <= numberOfVertices; j++)
{
std::cout<<adjacency_matrix[i][j]<<" ";
}
std::cout << std::endl;
}
// Incidence Matrix
int counter = 0;
for( int i = 1; i <= numberOfEdges; i++){
for(int j = i + 1; j < numberOfVertices; j++ ){
if(adjacency_matrix[i][j] == 1){
incidence_matrix[i][counter] = 1;
incidence_matrix[j][counter] = 1;
++counter;
}
}
}
for( int i = 1; i <= numberOfVertices; i++){
for(int j = 1; j <= numberOfEdges; j++){
std::cout<<incidence_matrix[i][j]<<" ";
}
std::cout<<std::endl;
}

代码中的想法是正确的。但是数组中的索引是错误的。

索引应从0开始。注意:这也适用于设置邻接矩阵。

用于命名最初为1,2,3,4,5,6的顶点/节点的数字。我建议称它们为0,1,2,3,4,5。然后,原始边(1,2(变为(0,1(。但是,如果我们一致地重命名所有顶点,我们最终会得到相同的图。这种新命名约定的优点是,我们可以直接将这些名称用作您正在使用的C++数据结构中的索引。(假设我们使用相应的整数值,而不将这些名称视为字符串。(

图形的规格变为

Graph* g = new Graph(numberOfVertices, numberOfEdges);
g->edge[0]->src = 0;
g->edge[0]->dest = 1;
g->edge[1]->src = 0;
g->edge[1]->dest = 4;
g->edge[2]->src = 0;
g->edge[2]->dest = 5;
g->edge[3]->src = 1;
g->edge[3]->dest = 2;
g->edge[4]->src = 1;
g->edge[4]->dest = 4;
g->edge[5]->src = 2;
g->edge[5]->dest = 3;
g->edge[6]->src = 2;
g->edge[6]->dest = 4;
g->edge[7]->src = 3;
g->edge[7]->dest = 4;
g->edge[8]->src = 4;
g->edge[8]->dest = 5;

因此,打印邻接矩阵变成:

std::cout << "Adjacency matrix : " << std::endl;
for (i = 0; i < numberOfVertices; i++)
{
for (j = 0; j < numberOfVertices; j++)
{
std::cout<<adjacency_matrix[i][j]<<" ";
}
std::cout << std::endl;
}

并且关联矩阵的计算变为:

// Incidence Matrix
int counter = 0;
for( int i = 0; i < numberOfVertices; i++){  //numberOfVertices!!
for(int j = i + 1; j < numberOfVertices; j++ ){ 
if(adjacency_matrix[i][j] == 1){
incidence_matrix[i][counter] = 1;
incidence_matrix[j][counter] = 1;
++counter;
}
}
}
for( int i = 0; i < numberOfVertices; i++){
for(int j = 0; j < numberOfEdges; j++){
std::cout<<incidence_matrix[i][j]<<" ";
}
std::cout<<std::endl;
}

请注意,边的顺序现在由遍历邻接矩阵的顺序决定。

最新更新