我正在努力以某种必要的方式将边缘列表转换为邻接矩阵。
问题:
邻接矩阵应该具有连接到顶点的边数,因此它不应该只有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;
}
答案 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]++;
}
}
}