如何在C ++中将边缘列表转换为邻接矩阵的边数连接到顶点而不是1?

时间:2017-03-19 13:50:30

标签: c++ algorithm matrix graph-theory edges

我正在努力以某种必要的方式将边缘列表转换为邻接矩阵。

问题:

邻接矩阵应该具有连接到顶点的边数,因此它不应该只有1个连接两个顶点的地方。为了更好地解释,这里是样本输入。

输入

4 7
1 2
2 3
3 2
2 4
4 1
4 2
3 2
其中4是顶点数,7是边数,每行代表边。

输出:

4
0 1 0 1
1 0 3 2
0 3 0 0
1 2 0 0
其中4是顶点数,每行代表顶点连接的次数。

在我的代码中我只设法用1s转换为普通的Adjacency矩阵,但是我无法理解我是否只能用数组来解决这个任务? 这是我的代码:

#include <iostream>

using namespace std;

int main()
{
    int adjMatrix[100][100] = { };
    int edgeList[100][100];
    int row, col;
    int N, M;

    cin >> N;
    cin >> M;

    for (int i = 0; i < 100; i++)
    {
        for (int j = 0; j < 100; j++)
        {
            adjMatrix[i][j] = 0;
        }
    }

    for (int i = 1; i < 8; i++)
    {
        for (int j = 1; j <= 2; j++)
        {
            cin >> row;
            cin >> col;
            adjMatrix[row][col] = 1;
            adjMatrix[col][row] = 1;

        }
    }

    for (int i = 1; i < 8; i++)
    {
        for (int j = 1; j <= 2; j++)
        {
            if (adjMatrix[i][j] == adjMatrix[j][i])
            {
                adjMatrix[i][j]++;
            }

        }
    }
    cout << N << endl;

    for (int i = 1; i <= N; i++)
    {
        for (int j = 1; j <= N; j++)
        {
            cout << adjMatrix[i][j] << " ";

        }
        cout << endl;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

问题:想要连接数,而不仅仅是存在连接。

解决方案:使用++

adjMatrix[row][col]++;
adjMatrix[col][row]++;

值得注意的是

此循环

for (int i = 0; i < 100; i++)
{
    for (int j = 0; j < 100; j++)
    {
        adjMatrix[i][j] = 0;
    }
}

通过

呈现多余
int adjMatrix[100][100] = { };

因为= {}默认初始化数组,所有元素都设置为0。

此外,如果N大于用于定义数组维度的100,该怎么办? adjMatrix需要充满活力。阅读并使用std::vector

以下循环条件不正确

    for (int i = 1; i < 8; i++)
    {
        for (int j = 1; j <= 2; j++)
        {
            cin >> row;
            cin >> col;
            adjMatrix[row][col] = 1;
            adjMatrix[col][row] = 1;
        }
    }

无论文件大小如何,始终都会从文件中读取14行。外循环总是运行7次(1..7),内循环总是运行两次(1..2)。

M定义文件中的行数。用它来控制你的循环。

如果文件中的行数少于14行,则此固定行数尤其不正确,因为cin >>未进行有效性测试。代码可能是用垃圾加载矩阵,你永远不会知道。而是使用像

这样的东西
if (cin >> row >> col)
{
    do stuff
}
else
{
    handle error
} 

程序必须验证所有输入,因为您不能信任那些粘糊糊的用户。一分钟他们正在制造拼写错误而下一次试图入侵五角大楼。

这个循环没有任何用处,但你已经知道了。根本没有想到这一点。不假思索地编写代码非常困难。这就是为什么我这么久都没有回答这个问题。不思考也会对提供帮助的其他人产生不利影响。

for (int i = 1; i < 8; i++)
{
    for (int j = 1; j <= 2; j++)
    {
        if (adjMatrix[i][j] == adjMatrix[j][i])
        {
            adjMatrix[i][j]++;
        }

    }
}