说我有一个包含内容的.txt
文件
5
0 1
1 2
2 4
3 2
4 0
1 3
第一个数字是文件中的集合数(NxN矩阵)。其余的是一组简单的图表。
我想知道从文件中存储数据集(表示简单图形的点)的最佳方法是什么。希望使用此数据创建和显示邻接矩阵。
例如:
0 1 0 0 1
1 0 1 1 0
0 1 0 1 1
0 1 1 0 0
1 0 1 1 1
我想从文件中提取它们,以某种方式存储它们,然后我可以将它们相互比较以进行邻接。
我希望能够单独阅读这两个数字,所以如果我看到集合4 0
,我知道4与0相邻,反之亦然。我还希望能够在每个矩阵行中查看图中的每个集合(4& 0是相邻的,还有4个相邻的那个)
您如何存储这些数据以满足我的需求?堆?阵列?矢量?
干杯
答案 0 :(得分:1)
要存储这对顶点,您可以使用std::pair:
vector<pair<int, int> > vertices;
while(cin >> a >> b){
vertices.push_back(make_pair(a, b));
}
将顶点存储在对向量中后,可以使用2-d matrix
存储邻接列表。如果其中一对是(1,2)
,那么您将索引(1,2)
处的矩阵以及(2,1)
(因为图形似乎是无向的)初始化为1,表示它们具有common edge,否则将该索引初始化为0。
int **adjacency = new int *[n];
for(int i = 0;i < n;i++)
adjacency = new int[n];
memset(adjacency, 0, sizeof(adjacency));
vector<pair<int, int> >::iterator it = vertices.begin();
while(it != vertices.end()){
adjacency[it -> first][it -> second] = 1;
adjacency[it -> second][it -> first] = 1;
}
答案 1 :(得分:1)
std::map<unsigned, std::vector<unsigned>> sparse;
sparse
是节点编号到相邻节点列表的映射。我和unsigned
一起去了,因为大多数基于阵列的矩阵都讨厌负指数。这种布局不是问题,但重点似乎是建立一个高速查找的邻接矩阵。假设稀疏矩阵,这种结构较小,但与布尔值数组相比,它是sloooooooow。如果您有足够的RAM,请使用它。这就是它的用途。
unsigned a,b;
while(in >> a >> b)
{
sparse[a].push_back(b);
sparse[b].push_back(a);
}
a
和b
相邻,因此会将它们添加到彼此的行中。 sparse[nodeNum]
返回对nodeNum
向量的引用,因此存在相邻节点列表。例如:
std::cout << "4 is adjacent to ";
for(unsigned val: sparse[4])
{
std::cout << val << " ";
}
将在OP的示例中打印出所有4个邻居节点,2和0。
现在您已经阅读了所有内容,您可以轻松确定尺寸(如果您还没有通过记录读取文件时看到的最大数字)分配矩阵,并从穷人的稀疏矩阵中加载它如上所述。